{"files":{"SKILL.md":"---\nname: telnyx-api\ndescription: \"Telnyx API skill. Use when working with Telnyx for .well-known, 10dlc, access_ip_address. Covers 1390 endpoints.\"\nversion: 1.0.0\ngenerator: lapsh\n---\n\n# Telnyx API\nAPI version: 2.0.0\n\n## Auth\nBearer bearer | ApiKey Authorization in header | Bearer bearer | Bearer bearer | Bearer bearer | Bearer bearer | Bearer bearer | OAuth2 | Bearer bearer | Bearer bearer | Bearer bearer | Bearer bearer | Bearer bearer | Bearer bearer\n\n## Base URL\nhttps://api.telnyx.com/v2\n\n## Setup\n1. Set Authorization header with Bearer token\n2. GET /.well-known/oauth-authorization-server -- authorization server metadata\n3. POST /10dlc/brand -- create first brand\n\n## Endpoints\n1390 endpoints across 195 groups. See references/api-spec.lap for full details.\n\n### .well-known\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /.well-known/oauth-authorization-server | Authorization server metadata |\n| GET | /.well-known/oauth-protected-resource | Protected resource metadata |\n\n### 10dlc\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /10dlc/brand | List Brands |\n| POST | /10dlc/brand | Create Brand |\n| GET | /10dlc/brand/feedback/{brandId} | Get Brand Feedback By Id |\n| GET | /10dlc/brand/smsOtp/{referenceId} | Get Brand SMS OTP Status |\n| DELETE | /10dlc/brand/{brandId} | Delete Brand |\n| GET | /10dlc/brand/{brandId} | Get Brand |\n| PUT | /10dlc/brand/{brandId} | Update Brand |\n| POST | /10dlc/brand/{brandId}/2faEmail | Resend brand 2FA email |\n| GET | /10dlc/brand/{brandId}/externalVetting | List External Vettings |\n| POST | /10dlc/brand/{brandId}/externalVetting | Order Brand External Vetting |\n| PUT | /10dlc/brand/{brandId}/externalVetting | Import External Vetting Record |\n| PUT | /10dlc/brand/{brandId}/revet | Revet Brand |\n| GET | /10dlc/brand/{brandId}/smsOtp | Get Brand SMS OTP Status by Brand ID |\n| POST | /10dlc/brand/{brandId}/smsOtp | Trigger Brand SMS OTP |\n| PUT | /10dlc/brand/{brandId}/smsOtp | Verify Brand SMS OTP |\n| GET | /10dlc/brand_feedback/{brandId} | Get Brand Feedback By Id |\n| GET | /10dlc/campaign | List Campaigns |\n| POST | /10dlc/campaign/acceptSharing/{campaignId} | Accept Shared Campaign |\n| GET | /10dlc/campaign/usecase/cost | Get Campaign Cost |\n| GET | /10dlc/campaign/usecase_cost | Get Campaign Cost |\n| DELETE | /10dlc/campaign/{campaignId} | Deactivate campaign |\n| GET | /10dlc/campaign/{campaignId} | Get campaign |\n| PUT | /10dlc/campaign/{campaignId} | Update campaign |\n| POST | /10dlc/campaign/{campaignId}/appeal | Submit campaign appeal for manual review |\n| GET | /10dlc/campaign/{campaignId}/mnoMetadata | Get Campaign Mno Metadata |\n| GET | /10dlc/campaign/{campaignId}/operationStatus | Get campaign operation status |\n| GET | /10dlc/campaign/{campaignId}/osr/attributes | Get OSR campaign attributes |\n| GET | /10dlc/campaign/{campaignId}/osr_attributes | Get OSR campaign attributes |\n| GET | /10dlc/campaign/{campaignId}/sharing | Get Sharing Status |\n| POST | /10dlc/campaignBuilder | Submit Campaign |\n| GET | /10dlc/campaignBuilder/brand/{brandId}/usecase/{usecase} | Qualify By Usecase |\n| GET | /10dlc/enum/{endpoint} | Get Enum |\n| GET | /10dlc/partnerCampaign/sharedByMe | List shared partner campaigns |\n| GET | /10dlc/partnerCampaign/{campaignId}/sharing | Get Sharing Status |\n| GET | /10dlc/partner_campaigns | List Shared Campaigns |\n| GET | /10dlc/partner_campaigns/{campaignId} | Get Single Shared Campaign |\n| PATCH | /10dlc/partner_campaigns/{campaignId} | Update Single Shared Campaign |\n| POST | /10dlc/phoneNumberAssignmentByProfile | Assign Messaging Profile To Campaign |\n| GET | /10dlc/phoneNumberAssignmentByProfile/{taskId} | Get Assignment Task Status |\n| GET | /10dlc/phoneNumberAssignmentByProfile/{taskId}/phoneNumbers | Get Phone Number Status |\n| GET | /10dlc/phone_number_campaigns | List phone number campaigns |\n| POST | /10dlc/phone_number_campaigns | Create New Phone Number Campaign |\n| DELETE | /10dlc/phone_number_campaigns/{phoneNumber} | Delete Phone Number Campaign |\n| GET | /10dlc/phone_number_campaigns/{phoneNumber} | Get Single Phone Number Campaign |\n| PUT | /10dlc/phone_number_campaigns/{phoneNumber} | Update Phone Number Campaign |\n\n### Access_ip_address\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /access_ip_address | List all Access IP Addresses |\n| POST | /access_ip_address | Create new Access IP Address |\n| DELETE | /access_ip_address/{access_ip_address_id} | Delete access IP address |\n| GET | /access_ip_address/{access_ip_address_id} | Retrieve an access IP address |\n\n### Access_ip_ranges\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /access_ip_ranges | List all Access IP Ranges |\n| POST | /access_ip_ranges | Create new Access IP Range |\n| DELETE | /access_ip_ranges/{access_ip_range_id} | Delete access IP ranges |\n\n### Actions\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /actions/purchase/esims | Purchase eSIMs |\n| POST | /actions/register/sim_cards | Register SIM cards |\n\n### Addresses\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /addresses | List all addresses |\n| POST | /addresses | Creates an address |\n| POST | /addresses/actions/validate | Validate an address |\n| DELETE | /addresses/{id} | Deletes an address |\n| GET | /addresses/{id} | Retrieve an address |\n| POST | /addresses/{id}/actions/accept_suggestions | Accepts this address suggestion as a new emergency address for Operator Connect and finishes the uploads of the numbers associated with it to Microsoft. |\n\n### Advanced_orders\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /advanced_orders | List Advanced Orders |\n| POST | /advanced_orders | Create Advanced Order |\n| PATCH | /advanced_orders/{advanced-order-id}/requirement_group | Update Advanced Order |\n| GET | /advanced_orders/{order_id} | Get Advanced Order |\n\n### Ai\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /ai/anthropic/v1/messages | Create a message (Anthropic-compatible) |\n| GET | /ai/assistants | List assistants |\n| POST | /ai/assistants | Create an assistant |\n| POST | /ai/assistants/import | Import assistants from external provider |\n| GET | /ai/assistants/tags | Get All Tags |\n| GET | /ai/assistants/tests | List assistant tests with pagination |\n| POST | /ai/assistants/tests | Create a new assistant test |\n| GET | /ai/assistants/tests/test-suites | Get all test suite names |\n| GET | /ai/assistants/tests/test-suites/{suite_name}/runs | Get test suite run history |\n| POST | /ai/assistants/tests/test-suites/{suite_name}/runs | Trigger test suite execution |\n| DELETE | /ai/assistants/tests/{test_id} | Delete an assistant test |\n| GET | /ai/assistants/tests/{test_id} | Get assistant test by ID |\n| PUT | /ai/assistants/tests/{test_id} | Update an assistant test |\n| GET | /ai/assistants/tests/{test_id}/runs | Get test run history for a specific test |\n| POST | /ai/assistants/tests/{test_id}/runs | Trigger a manual test run |\n| GET | /ai/assistants/tests/{test_id}/runs/{run_id} | Get specific test run details |\n| DELETE | /ai/assistants/{assistant_id} | Delete an assistant |\n| GET | /ai/assistants/{assistant_id} | Get an assistant |\n| POST | /ai/assistants/{assistant_id} | Update an assistant |\n| DELETE | /ai/assistants/{assistant_id}/canary-deploys | Delete Canary Deploy |\n| GET | /ai/assistants/{assistant_id}/canary-deploys | Get Canary Deploy |\n| POST | /ai/assistants/{assistant_id}/canary-deploys | Create Canary Deploy |\n| PUT | /ai/assistants/{assistant_id}/canary-deploys | Update Canary Deploy |\n| POST | /ai/assistants/{assistant_id}/chat | Assistant Chat |\n| POST | /ai/assistants/{assistant_id}/chat/sms | Assistant Sms Chat |\n| POST | /ai/assistants/{assistant_id}/clone | Clone Assistant |\n| POST | /ai/assistants/{assistant_id}/instructions/enhance | Enhance Assistant Instructions |\n| GET | /ai/assistants/{assistant_id}/scheduled_events | List scheduled events |\n| POST | /ai/assistants/{assistant_id}/scheduled_events | Create a scheduled event |\n| DELETE | /ai/assistants/{assistant_id}/scheduled_events/{event_id} | Delete a scheduled event |\n| GET | /ai/assistants/{assistant_id}/scheduled_events/{event_id} | Get a scheduled event |\n| POST | /ai/assistants/{assistant_id}/tags | Add Assistant Tag |\n| DELETE | /ai/assistants/{assistant_id}/tags/{tag} | Remove Assistant Tag |\n| GET | /ai/assistants/{assistant_id}/texml | Get assistant texml |\n| DELETE | /ai/assistants/{assistant_id}/tools/{tool_id} | Remove Assistant Tool |\n| PUT | /ai/assistants/{assistant_id}/tools/{tool_id} | Add Assistant Tool |\n| POST | /ai/assistants/{assistant_id}/tools/{tool_id}/test | Test Assistant Tool |\n| GET | /ai/assistants/{assistant_id}/versions | Get all versions of an assistant |\n| DELETE | /ai/assistants/{assistant_id}/versions/{version_id} | Delete a specific assistant version |\n| GET | /ai/assistants/{assistant_id}/versions/{version_id} | Get a specific assistant version |\n| POST | /ai/assistants/{assistant_id}/versions/{version_id} | Update a specific assistant version |\n| POST | /ai/assistants/{assistant_id}/versions/{version_id}/promote | Promote an assistant version to main |\n| POST | /ai/audio/transcriptions | Transcribe speech to text |\n| POST | /ai/chat/completions | Create a chat completion |\n| GET | /ai/clusters | List all clusters |\n| POST | /ai/clusters | Compute new clusters |\n| DELETE | /ai/clusters/{task_id} | Delete a cluster |\n| GET | /ai/clusters/{task_id} | Fetch a cluster |\n| GET | /ai/clusters/{task_id}/graph | Fetch a cluster visualization |\n| GET | /ai/collections | List collections |\n| POST | /ai/collections | Create a collection |\n| GET | /ai/collections/slug/{slug} | Get a collection by slug |\n| DELETE | /ai/collections/{uuid} | Delete a collection |\n| GET | /ai/collections/{uuid} | Get a collection |\n| PATCH | /ai/collections/{uuid} | Update a collection |\n| GET | /ai/collections/{uuid}/settings | Get collection settings |\n| PATCH | /ai/collections/{uuid}/settings | Update collection settings |\n| PUT | /ai/collections/{uuid}/settings | Replace collection settings |\n| GET | /ai/collections/{uuid}/sources | List collection sources |\n| POST | /ai/collections/{uuid}/sources | Add a collection source |\n| PUT | /ai/collections/{uuid}/sources | Replace collection sources |\n| DELETE | /ai/collections/{uuid}/sources/{sourceId} | Remove a collection source |\n| GET | /ai/conversation_histories | Search conversation histories |\n| GET | /ai/conversations | List conversations |\n| POST | /ai/conversations | Create a conversation |\n| GET | /ai/conversations/conversation-insights/aggregates | Aggregate Conversation Insights |\n| GET | /ai/conversations/insight-groups | Get Insight Template Groups |\n| POST | /ai/conversations/insight-groups | Create Insight Template Group |\n| DELETE | /ai/conversations/insight-groups/{group_id} | Delete Insight Template Group |\n| GET | /ai/conversations/insight-groups/{group_id} | Get Insight Template Group |\n| PUT | /ai/conversations/insight-groups/{group_id} | Update Insight Template Group |\n| POST | /ai/conversations/insight-groups/{group_id}/insights/{insight_id}/assign | Assign Insight Template To Group |\n| DELETE | /ai/conversations/insight-groups/{group_id}/insights/{insight_id}/unassign | Unassign Insight Template From Group |\n| GET | /ai/conversations/insights | Get Insight Templates |\n| POST | /ai/conversations/insights | Create Insight Template |\n| DELETE | /ai/conversations/insights/{insight_id} | Delete Insight Template |\n| GET | /ai/conversations/insights/{insight_id} | Get Insight Template |\n| PUT | /ai/conversations/insights/{insight_id} | Update Insight Template |\n| DELETE | /ai/conversations/{conversation_id} | Delete a conversation |\n| GET | /ai/conversations/{conversation_id} | Get a conversation |\n| PUT | /ai/conversations/{conversation_id} | Update conversation metadata |\n| GET | /ai/conversations/{conversation_id}/conversations-insights | Get insights for a conversation |\n| POST | /ai/conversations/{conversation_id}/message | Create Message |\n| GET | /ai/conversations/{conversation_id}/messages | Get conversation messages |\n| GET | /ai/embeddings | Get Tasks by Status |\n| POST | /ai/embeddings | Embed documents |\n| GET | /ai/embeddings/buckets | List embedded buckets |\n| DELETE | /ai/embeddings/buckets/{bucket_name} | Disable AI for an Embedded Bucket |\n| GET | /ai/embeddings/buckets/{bucket_name} | Get file-level embedding statuses for a bucket |\n| POST | /ai/embeddings/similarity-search | Search for documents |\n| POST | /ai/embeddings/url | Embed URL content |\n| GET | /ai/embeddings/{task_id} | Get an embedding task's status |\n| GET | /ai/fine_tuning/jobs | List fine tuning jobs |\n| POST | /ai/fine_tuning/jobs | Create a fine tuning job |\n| GET | /ai/fine_tuning/jobs/{job_id} | Get a fine tuning job |\n| POST | /ai/fine_tuning/jobs/{job_id}/cancel | Cancel a fine tuning job |\n| GET | /ai/integrations | List Integrations |\n| GET | /ai/integrations/connections | List User Integrations |\n| DELETE | /ai/integrations/connections/{user_connection_id} | Delete Integration Connection |\n| GET | /ai/integrations/connections/{user_connection_id} | Get User Integration connection By Id |\n| GET | /ai/integrations/{integration_id} | List Integration By Id |\n| GET | /ai/knowledge/collections/{slug}/documents | Search collection documents |\n| GET | /ai/mcp_servers | List MCP Servers |\n| POST | /ai/mcp_servers | Create MCP Server |\n| DELETE | /ai/mcp_servers/{mcp_server_id} | Delete MCP Server |\n| GET | /ai/mcp_servers/{mcp_server_id} | Get MCP Server |\n| PUT | /ai/mcp_servers/{mcp_server_id} | Update MCP Server |\n| GET | /ai/memory/namespaces | List your namespaces |\n| POST | /ai/memory/namespaces | Create a namespace |\n| DELETE | /ai/memory/namespaces/{namespace} | Delete a namespace |\n| GET | /ai/memory/namespaces/{namespace}/operations/{operation_id} | Status of a write |\n| GET | /ai/memory/namespaces/{namespace}/profiles | List a namespace's profiles |\n| DELETE | /ai/memory/namespaces/{namespace}/profiles/{profile_id} | Forget a profile's memories |\n| POST | /ai/memory/namespaces/{namespace}/profiles/{profile_id}/ingest | Ingest a session's messages into a profile |\n| GET | /ai/memory/namespaces/{namespace}/profiles/{profile_id}/memories | List a profile's memories, most recent first |\n| GET | /ai/memory/namespaces/{namespace}/profiles/{profile_id}/memories/{memory_id} | Read one memory, and what it came from |\n| POST | /ai/memory/namespaces/{namespace}/profiles/{profile_id}/recall | Recall a profile's memories, ranked |\n| POST | /ai/memory/namespaces/{namespace}/profiles/{profile_id}/remember | Remember one fact, stored as written |\n| GET | /ai/memory/namespaces/{namespace}/profiles/{profile_id}/sources | List a profile's sources, most recently written first |\n| DELETE | /ai/memory/namespaces/{namespace}/profiles/{profile_id}/sources/{source_id} | Forget one source |\n| GET | /ai/memory/namespaces/{namespace}/profiles/{profile_id}/sources/{source_id} | Read one source, with what was stored |\n| GET | /ai/memory/namespaces/{namespace}/profiles/{profile_id}/summary | Get a profile's precomputed summary |\n| GET | /ai/memory/namespaces/{namespace}/settings | Get a namespace's settings |\n| PATCH | /ai/memory/namespaces/{namespace}/settings | Change a namespace's settings |\n| GET | /ai/missions | List missions |\n| POST | /ai/missions | Create mission |\n| GET | /ai/missions/events | List recent events |\n| GET | /ai/missions/runs | List recent runs |\n| DELETE | /ai/missions/{mission_id} | Delete mission |\n| GET | /ai/missions/{mission_id} | Get mission |\n| PUT | /ai/missions/{mission_id} | Update mission |\n| POST | /ai/missions/{mission_id}/clone | Clone mission |\n| GET | /ai/missions/{mission_id}/knowledge-bases | List knowledge bases |\n| POST | /ai/missions/{mission_id}/knowledge-bases | Create knowledge base |\n| DELETE | /ai/missions/{mission_id}/knowledge-bases/{knowledge_base_id} | Delete knowledge base |\n| GET | /ai/missions/{mission_id}/knowledge-bases/{knowledge_base_id} | Get knowledge base |\n| PUT | /ai/missions/{mission_id}/knowledge-bases/{knowledge_base_id} | Update knowledge base |\n| GET | /ai/missions/{mission_id}/mcp-servers | List MCP servers |\n| POST | /ai/missions/{mission_id}/mcp-servers | Create MCP server |\n| DELETE | /ai/missions/{mission_id}/mcp-servers/{mcp_server_id} | Delete MCP server |\n| GET | /ai/missions/{mission_id}/mcp-servers/{mcp_server_id} | Get MCP server |\n| PUT | /ai/missions/{mission_id}/mcp-servers/{mcp_server_id} | Update MCP server |\n| GET | /ai/missions/{mission_id}/runs | List runs for mission |\n| POST | /ai/missions/{mission_id}/runs | Start a run |\n| GET | /ai/missions/{mission_id}/runs/{run_id} | Get run details |\n| PATCH | /ai/missions/{mission_id}/runs/{run_id} | Update run |\n| POST | /ai/missions/{mission_id}/runs/{run_id}/cancel | Cancel run |\n| GET | /ai/missions/{mission_id}/runs/{run_id}/events | List events |\n| POST | /ai/missions/{mission_id}/runs/{run_id}/events | Log event |\n| GET | /ai/missions/{mission_id}/runs/{run_id}/events/{event_id} | Get event details |\n| POST | /ai/missions/{mission_id}/runs/{run_id}/pause | Pause run |\n| GET | /ai/missions/{mission_id}/runs/{run_id}/plan | Get plan |\n| POST | /ai/missions/{mission_id}/runs/{run_id}/plan | Create initial plan |\n| POST | /ai/missions/{mission_id}/runs/{run_id}/plan/steps | Add step(s) to plan |\n| GET | /ai/missions/{mission_id}/runs/{run_id}/plan/steps/{step_id} | Get step details |\n| PATCH | /ai/missions/{mission_id}/runs/{run_id}/plan/steps/{step_id} | Update step status |\n| POST | /ai/missions/{mission_id}/runs/{run_id}/resume | Resume run |\n| GET | /ai/missions/{mission_id}/runs/{run_id}/telnyx-agents | List linked Telnyx agents |\n| POST | /ai/missions/{mission_id}/runs/{run_id}/telnyx-agents | Link Telnyx agent to run |\n| DELETE | /ai/missions/{mission_id}/runs/{run_id}/telnyx-agents/{telnyx_agent_id} | Unlink Telnyx agent |\n| GET | /ai/missions/{mission_id}/tools | List tools |\n| POST | /ai/missions/{mission_id}/tools | Create tool |\n| DELETE | /ai/missions/{mission_id}/tools/{tool_id} | Delete tool |\n| GET | /ai/missions/{mission_id}/tools/{tool_id} | Get tool |\n| PUT | /ai/missions/{mission_id}/tools/{tool_id} | Update tool |\n| GET | /ai/models | Get available models |\n| POST | /ai/openai/chat/completions | Create a chat completion (OpenAI-compatible) |\n| POST | /ai/openai/embeddings | Create embeddings |\n| GET | /ai/openai/embeddings/models | List embedding models |\n| GET | /ai/openai/models | Get available models (OpenAI-compatible) |\n| POST | /ai/openai/responses | Create an OpenAI-compatible response |\n| POST | /ai/responses | Create a response |\n| POST | /ai/summarize | Summarize file content |\n| GET | /ai/tools | List Tools |\n| POST | /ai/tools | Create Tool |\n| DELETE | /ai/tools/{tool_id} | Delete Tool |\n| GET | /ai/tools/{tool_id} | Get Tool |\n| PATCH | /ai/tools/{tool_id} | Update Tool |\n| POST | /ai/typesafe/v1/systemone | Evaluate decision models (TypeSafe-compatible) |\n\n### Alphanumeric_sender_ids\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /alphanumeric_sender_ids | List alphanumeric sender IDs |\n| POST | /alphanumeric_sender_ids | Create an alphanumeric sender ID |\n| DELETE | /alphanumeric_sender_ids/{id} | Delete an alphanumeric sender ID |\n| GET | /alphanumeric_sender_ids/{id} | Retrieve an alphanumeric sender ID |\n\n### Audit_events\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /audit_events | List Audit Logs |\n\n### Authentication_providers\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /authentication_providers | List all SSO authentication providers |\n| POST | /authentication_providers | Creates an authentication provider |\n| DELETE | /authentication_providers/{id} | Deletes an authentication provider |\n| GET | /authentication_providers/{id} | Retrieve an authentication provider |\n| PATCH | /authentication_providers/{id} | Update an authentication provider |\n\n### Available_phone_number_blocks\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /available_phone_number_blocks | List available phone number blocks |\n\n### Available_phone_numbers\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /available_phone_numbers | List available phone numbers |\n\n### Balance\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /balance | Get user balance details |\n\n### Billing_groups\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /billing_groups | List all billing groups |\n| POST | /billing_groups | Create a billing group |\n| DELETE | /billing_groups/{id} | Delete a billing group |\n| GET | /billing_groups/{id} | Get a billing group |\n| PATCH | /billing_groups/{id} | Update a billing group |\n\n### Bulk_sim_card_actions\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /bulk_sim_card_actions | List bulk SIM card actions |\n| GET | /bulk_sim_card_actions/{id} | Get bulk SIM card action details |\n\n### Bundle_pricing\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /bundle_pricing/billing_bundles | Retrieve Bundles |\n| GET | /bundle_pricing/billing_bundles/{bundle_id} | Get Bundle By Id |\n| GET | /bundle_pricing/user_bundles | Get User Bundles |\n| POST | /bundle_pricing/user_bundles/bulk | Create User Bundles |\n| GET | /bundle_pricing/user_bundles/unused | Get Unused User Bundles |\n| DELETE | /bundle_pricing/user_bundles/{user_bundle_id} | Deactivate User Bundle |\n| GET | /bundle_pricing/user_bundles/{user_bundle_id} | Get User Bundle by Id |\n| GET | /bundle_pricing/user_bundles/{user_bundle_id}/resources | Get User Bundle Resources |\n\n### Call_control_applications\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /call_control_applications | List call control applications |\n| POST | /call_control_applications | Create a call control application |\n| DELETE | /call_control_applications/{id} | Delete a call control application |\n| GET | /call_control_applications/{id} | Retrieve a call control application |\n| PATCH | /call_control_applications/{id} | Update a call control application |\n\n### Call_events\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /call_events | List call events |\n\n### Call_reasons\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /call_reasons | List standard call reasons |\n| POST | /call_reasons/validate | Validate a list of call reasons |\n\n### Calls\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /calls | Dial |\n| GET | /calls/{call_control_id} | Retrieve a call status |\n| POST | /calls/{call_control_id}/actions/ai_assistant_add_messages | Add messages to AI Assistant |\n| POST | /calls/{call_control_id}/actions/ai_assistant_join | Join AI Assistant Conversation |\n| POST | /calls/{call_control_id}/actions/ai_assistant_start | Start AI Assistant |\n| POST | /calls/{call_control_id}/actions/ai_assistant_stop | Stop AI Assistant |\n| POST | /calls/{call_control_id}/actions/answer | Answer call |\n| POST | /calls/{call_control_id}/actions/bridge | Bridge calls |\n| PUT | /calls/{call_control_id}/actions/client_state_update | Update client state |\n| POST | /calls/{call_control_id}/actions/conversation_relay_start | Start Conversation Relay |\n| POST | /calls/{call_control_id}/actions/conversation_relay_stop | Stop Conversation Relay |\n| POST | /calls/{call_control_id}/actions/enqueue | Enqueue call |\n| POST | /calls/{call_control_id}/actions/fork_start | Forking start |\n| POST | /calls/{call_control_id}/actions/fork_stop | Forking stop |\n| POST | /calls/{call_control_id}/actions/gather | Gather |\n| POST | /calls/{call_control_id}/actions/gather_stop | Gather stop |\n| POST | /calls/{call_control_id}/actions/gather_using_ai | Gather using AI |\n| POST | /calls/{call_control_id}/actions/gather_using_audio | Gather using audio |\n| POST | /calls/{call_control_id}/actions/gather_using_speak | Gather using speak |\n| POST | /calls/{call_control_id}/actions/hangup | Hangup call |\n| POST | /calls/{call_control_id}/actions/leave_queue | Remove call from a queue |\n| POST | /calls/{call_control_id}/actions/pay | Process a payment |\n| POST | /calls/{call_control_id}/actions/playback_start | Play audio URL |\n| POST | /calls/{call_control_id}/actions/playback_stop | Stop audio playback |\n| POST | /calls/{call_control_id}/actions/record_pause | Record pause |\n| POST | /calls/{call_control_id}/actions/record_resume | Record resume |\n| POST | /calls/{call_control_id}/actions/record_start | Recording start |\n| POST | /calls/{call_control_id}/actions/record_stop | Recording stop |\n| POST | /calls/{call_control_id}/actions/refer | SIP Refer a call |\n| POST | /calls/{call_control_id}/actions/reject | Reject a call |\n| POST | /calls/{call_control_id}/actions/send_dtmf | Send DTMF |\n| POST | /calls/{call_control_id}/actions/send_sip_info | Send SIP info |\n| POST | /calls/{call_control_id}/actions/siprec_start | SIPREC start |\n| POST | /calls/{call_control_id}/actions/siprec_stop | SIPREC stop |\n| POST | /calls/{call_control_id}/actions/speak | Speak text |\n| POST | /calls/{call_control_id}/actions/streaming_start | Streaming start |\n| POST | /calls/{call_control_id}/actions/streaming_stop | Streaming stop |\n| POST | /calls/{call_control_id}/actions/suppression_start | Noise Suppression Start (BETA) |\n| POST | /calls/{call_control_id}/actions/suppression_stop | Noise Suppression Stop (BETA) |\n| POST | /calls/{call_control_id}/actions/switch_supervisor_role | Switch supervisor role |\n| POST | /calls/{call_control_id}/actions/transcription_start | Transcription start |\n| POST | /calls/{call_control_id}/actions/transcription_stop | Transcription stop |\n| POST | /calls/{call_control_id}/actions/transfer | Transfer call |\n\n### Channel_zones\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /channel_zones | List your voice channels for non-US zones |\n| PUT | /channel_zones/{channel_zone_id} | Update voice channels for non-US Zones |\n\n### Charges_breakdown\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /charges_breakdown | Get monthly charges breakdown |\n\n### Charges_summary\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /charges_summary | Get monthly charges summary |\n\n### Comments\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /comments | Retrieve all comments |\n| POST | /comments | Create a comment |\n| GET | /comments/{id} | Retrieve a comment |\n| PATCH | /comments/{id}/read | Mark a comment as read |\n\n### Compute\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /compute/funcs/{id}/logs | Get function logs |\n| DELETE | /compute/funcs/{id}/logs/export | Delete log export configuration |\n| GET | /compute/funcs/{id}/logs/export | Get log export configuration |\n| PUT | /compute/funcs/{id}/logs/export | Configure log export destination |\n| GET | /compute/funcs/{id}/metric_aggregates | Get function metric aggregates |\n| GET | /compute/funcs/{id}/revisions | List function revisions |\n| GET | /compute/funcs/{id}/ship_inspection | Inspect latest function ship |\n\n### Conferences\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /conferences | List conferences |\n| POST | /conferences | Create conference |\n| GET | /conferences/{conference_id}/participants | List conference participants |\n| GET | /conferences/{id} | Retrieve a conference |\n| POST | /conferences/{id}/actions/end | End a conference |\n| POST | /conferences/{id}/actions/gather_using_audio | Gather DTMF using audio prompt in a conference |\n| POST | /conferences/{id}/actions/hold | Hold conference participants |\n| POST | /conferences/{id}/actions/join | Join a conference |\n| POST | /conferences/{id}/actions/leave | Leave a conference |\n| POST | /conferences/{id}/actions/mute | Mute conference participants |\n| POST | /conferences/{id}/actions/play | Play audio to conference participants |\n| POST | /conferences/{id}/actions/record_pause | Conference recording pause |\n| POST | /conferences/{id}/actions/record_resume | Conference recording resume |\n| POST | /conferences/{id}/actions/record_start | Conference recording start |\n| POST | /conferences/{id}/actions/record_stop | Conference recording stop |\n| POST | /conferences/{id}/actions/send_dtmf | Send DTMF to conference participants |\n| POST | /conferences/{id}/actions/speak | Speak text to conference participants |\n| POST | /conferences/{id}/actions/stop | Stop audio being played on the conference |\n| POST | /conferences/{id}/actions/unhold | Unhold conference participants |\n| POST | /conferences/{id}/actions/unmute | Unmute conference participants |\n| POST | /conferences/{id}/actions/update | Update conference participant |\n| GET | /conferences/{id}/participants/{participant_id} | Retrieve a conference participant |\n| PATCH | /conferences/{id}/participants/{participant_id} | Update a conference participant |\n\n### Connections\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /connections | List connections |\n| GET | /connections/count | Count connections |\n| GET | /connections/{connection_id}/active_calls | List all active calls for given connection |\n| GET | /connections/{id} | Retrieve a connection |\n\n### Country_coverage\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /country_coverage | Get country coverage |\n| GET | /country_coverage/countries/{country_code} | Get coverage for a specific country |\n\n### Credential_connections\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /credential_connections | List credential connections |\n| POST | /credential_connections | Create a credential connection |\n| DELETE | /credential_connections/{id} | Delete a credential connection |\n| GET | /credential_connections/{id} | Retrieve a credential connection |\n| PATCH | /credential_connections/{id} | Update a credential connection |\n| POST | /credential_connections/{id}/actions/check_registration_status | Check a Credential Connection Registration Status |\n\n### Custom_storage_credentials\n| Method | Path | Description |\n|--------|------|-------------|\n| DELETE | /custom_storage_credentials/{connection_id} | Delete a stored credential |\n| GET | /custom_storage_credentials/{connection_id} | Retrieve a stored credential |\n| POST | /custom_storage_credentials/{connection_id} | Create a custom storage credential |\n| PUT | /custom_storage_credentials/{connection_id} | Update a stored credential |\n\n### Customer_service_records\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /customer_service_records | List customer service records |\n| POST | /customer_service_records | Create a customer service record |\n| POST | /customer_service_records/phone_number_coverages | Verify CSR phone number coverage |\n| GET | /customer_service_records/{customer_service_record_id} | Get a customer service record |\n\n### Detail_records\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /detail_records | Search detail records |\n\n### Dialogflow_connections\n| Method | Path | Description |\n|--------|------|-------------|\n| DELETE | /dialogflow_connections/{connection_id} | Delete stored Dialogflow Connection |\n| GET | /dialogflow_connections/{connection_id} | Retrieve stored Dialogflow Connection |\n| POST | /dialogflow_connections/{connection_id} | Create a Dialogflow Connection |\n| PUT | /dialogflow_connections/{connection_id} | Update stored Dialogflow Connection |\n\n### Dir\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /dir | List all DIRs across your enterprises |\n| GET | /dir/document_types | List supported DIR document types |\n| DELETE | /dir/{dir_id} | Request deletion of a DIR |\n| GET | /dir/{dir_id} | Get a DIR by id |\n| PATCH | /dir/{dir_id} | Update a DIR |\n| GET | /dir/{dir_id}/bpo_authorizations | List a DIR's authorized BPOs |\n| POST | /dir/{dir_id}/bpo_loa | Render the BPO Authorization LOA for a DIR |\n| GET | /dir/{dir_id}/comments | List comments on a DIR |\n| POST | /dir/{dir_id}/comments | Post a comment on a DIR |\n| GET | /dir/{dir_id}/infringement_claims | List infringement claims for a DIR |\n| PUT | /dir/{dir_id}/infringement_update | Update a DIR to resolve an infringement concern |\n| POST | /dir/{dir_id}/loa | Render the Branded Calling LOA for a DIR |\n| GET | /dir/{dir_id}/phone_number_batches | List phone-number batches for a DIR |\n| GET | /dir/{dir_id}/phone_number_batches/{batch_id} | Get a phone-number batch |\n| DELETE | /dir/{dir_id}/phone_numbers | Remove phone numbers from a DIR |\n| GET | /dir/{dir_id}/phone_numbers | List phone numbers attached to a DIR |\n| POST | /dir/{dir_id}/phone_numbers | Add phone numbers to a DIR |\n| GET | /dir/{dir_id}/references | List a DIR's references |\n| POST | /dir/{dir_id}/references | Submit a DIR's references |\n| PATCH | /dir/{dir_id}/references/{ref_type}/{slot} | Update a DIR reference |\n| POST | /dir/{dir_id}/submit | Submit a DIR for vetting |\n| GET | /dir/{dir_id}/verify_email | Get email-ownership verification status |\n| POST | /dir/{dir_id}/verify_email | Send an email-ownership verification code |\n| POST | /dir/{dir_id}/verify_email/confirm | Confirm an email-ownership verification code |\n\n### Document_links\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /document_links | List all document links |\n\n### Documents\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /documents | List all documents |\n| POST | /documents | Upload a document |\n| DELETE | /documents/{id} | Delete a document |\n| GET | /documents/{id} | Retrieve a document |\n| PATCH | /documents/{id} | Update a document |\n| GET | /documents/{id}/download | Download a document |\n| GET | /documents/{id}/download_link | Generate a temporary download link for a document |\n\n### Dynamic_emergency_addresses\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /dynamic_emergency_addresses | List dynamic emergency addresses |\n| POST | /dynamic_emergency_addresses | Create a dynamic emergency address. |\n| DELETE | /dynamic_emergency_addresses/{id} | Delete a dynamic emergency address |\n| GET | /dynamic_emergency_addresses/{id} | Get a dynamic emergency address |\n\n### Dynamic_emergency_endpoints\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /dynamic_emergency_endpoints | List dynamic emergency endpoints |\n| POST | /dynamic_emergency_endpoints | Create a dynamic emergency endpoint. |\n| DELETE | /dynamic_emergency_endpoints/{id} | Delete a dynamic emergency endpoint |\n| GET | /dynamic_emergency_endpoints/{id} | Get a dynamic emergency endpoint |\n\n### Email_blocks\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /email_blocks | List suppressions |\n| POST | /email_blocks | Create a manual suppression |\n| GET | /email_blocks/export | Export suppressions as CSV |\n| POST | /email_blocks/import | Create an async CSV import job |\n| GET | /email_blocks/import/{id} | Poll an import job |\n| DELETE | /email_blocks/{id} | Soft-delete a suppression |\n| GET | /email_blocks/{id} | Retrieve a suppression |\n| GET | /email_blocks/{id}/events | List audit events for a suppression |\n\n### Email_domains\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /email_domains | List email domains |\n| POST | /email_domains | Create an email domain |\n| GET | /email_domains/{domain_id}/dns_records | List DNS records for an email domain |\n| POST | /email_domains/{domain_id}/rotate_dkim | Rotate the DKIM key for an email domain |\n| POST | /email_domains/{domain_id}/verify | Verify DNS records for an email domain |\n| GET | /email_domains/{domain_id}/webhooks | List webhooks for an email domain |\n| POST | /email_domains/{domain_id}/webhooks | Create a webhook for an email domain |\n| DELETE | /email_domains/{domain_id}/webhooks/{id} | Delete a webhook |\n| GET | /email_domains/{domain_id}/webhooks/{id} | Retrieve a webhook |\n| PATCH | /email_domains/{domain_id}/webhooks/{id} | Update a webhook |\n| DELETE | /email_domains/{id} | Delete an email domain |\n| GET | /email_domains/{id} | Retrieve an email domain |\n| PATCH | /email_domains/{id} | Update an email domain |\n| GET | /email_domains/{id}/health | Get domain health summary |\n\n### Email_events\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /email_events | List account email events |\n| GET | /email_events/stats | Get email event statistics |\n\n### Email_inboxes\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /email_inboxes | List email inboxes |\n| POST | /email_inboxes | Create an email inbox |\n| DELETE | /email_inboxes/{id} | Delete an email inbox |\n| GET | /email_inboxes/{id} | Get an email inbox |\n| GET | /email_inboxes/{inbox_id}/drafts | List drafts in an inbox |\n| POST | /email_inboxes/{inbox_id}/drafts | Create a draft |\n| DELETE | /email_inboxes/{inbox_id}/drafts/{draft_id} | Delete a draft |\n| GET | /email_inboxes/{inbox_id}/drafts/{draft_id} | Retrieve a draft |\n| PATCH | /email_inboxes/{inbox_id}/drafts/{draft_id} | Update a draft (alias) |\n| PUT | /email_inboxes/{inbox_id}/drafts/{draft_id} | Update a draft |\n| POST | /email_inboxes/{inbox_id}/drafts/{draft_id}/send | Send a draft |\n| DELETE | /email_inboxes/{inbox_id}/filters | Remove sender filter entries from an inbox |\n| GET | /email_inboxes/{inbox_id}/filters | List sender filters for an inbox |\n| POST | /email_inboxes/{inbox_id}/filters | Add sender filter entries to an inbox |\n| PUT | /email_inboxes/{inbox_id}/filters | Replace sender filters for an inbox |\n| GET | /email_inboxes/{inbox_id}/messages | List and search messages in an inbox |\n| PATCH | /email_inboxes/{inbox_id}/messages/{message_id} | Update an inbox message |\n| POST | /email_inboxes/{inbox_id}/messages/{message_id}/actions/forward | Forward an inbox message |\n| POST | /email_inboxes/{inbox_id}/messages/{message_id}/actions/reply | Reply to an inbox message |\n| POST | /email_inboxes/{inbox_id}/messages/{message_id}/actions/reply_all | Reply all to an inbox message |\n| POST | /email_inboxes/{inbox_id}/messages/{message_id}/drafts | Create a reply draft |\n| DELETE | /email_inboxes/{inbox_id}/messages/{message_id}/labels | Remove labels from an inbox message |\n| POST | /email_inboxes/{inbox_id}/messages/{message_id}/labels | Add labels to an inbox message |\n| GET | /email_inboxes/{inbox_id}/threads | List threads in an inbox |\n| GET | /email_inboxes/{inbox_id}/threads/{thread_id} | Get a thread and a page of its messages |\n| DELETE | /email_inboxes/{inbox_id}/threads/{thread_id}/labels | Remove labels from an inbox thread |\n| POST | /email_inboxes/{inbox_id}/threads/{thread_id}/labels | Add labels to an inbox thread |\n\n### Email_messages\n| Method | Path | Description |\n|--------|------|-------------|\n| DELETE | /email_messages | Delete email messages by address |\n| GET | /email_messages | List email messages |\n| POST | /email_messages | Create or send an email message |\n| POST | /email_messages/batch | Create a batch of email messages |\n| GET | /email_messages/{email_id}/events | List events for an email message |\n| GET | /email_messages/{email_id}/recipients | List recipients for an email message |\n| GET | /email_messages/{email_id}/recipients/{recipient_id} | Get a single recipient's delivery state |\n| DELETE | /email_messages/{email_id}/schedule | Cancel a scheduled email message |\n| PATCH | /email_messages/{email_id}/schedule | Reschedule a scheduled email message |\n| DELETE | /email_messages/{id} | Delete an email message |\n| GET | /email_messages/{id} | Get an email message |\n\n### Email_templates\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /email_templates | List email templates |\n| POST | /email_templates | Create an email template |\n| DELETE | /email_templates/{id} | Delete an email template |\n| GET | /email_templates/{id} | Get an email template |\n| PATCH | /email_templates/{id} | Update an email template |\n| PUT | /email_templates/{id} | Replace an email template |\n| POST | /email_templates/{id}/render | Render an email template |\n\n### Email_threads\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /email_threads | List threads across every inbox in the account |\n| GET | /email_threads/{thread_id} | Get an account-wide thread and a page of its messages |\n\n### Email_unsubscribe_groups\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /email_unsubscribe_groups | List unsubscribe groups |\n| POST | /email_unsubscribe_groups | Create an unsubscribe group |\n| DELETE | /email_unsubscribe_groups/{id} | Delete an unsubscribe group |\n| GET | /email_unsubscribe_groups/{id} | Retrieve an unsubscribe group |\n| PATCH | /email_unsubscribe_groups/{id} | Update an unsubscribe group |\n| GET | /email_unsubscribe_groups/{id}/suppressions | List suppressions in a group |\n| POST | /email_unsubscribe_groups/{id}/suppressions | Add a group suppression |\n| DELETE | /email_unsubscribe_groups/{id}/suppressions/{email} | Remove a group suppression |\n\n### Email_validations\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /email_validations | Validate a single email address |\n| POST | /email_validations/batch | Create a batch email validation job |\n| GET | /email_validations/batch/{id} | Get a batch email validation job |\n\n### Enterprises\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /enterprises | List enterprises |\n| POST | /enterprises | Create an enterprise |\n| DELETE | /enterprises/{enterprise_id} | Delete an enterprise |\n| GET | /enterprises/{enterprise_id} | Get an enterprise |\n| PUT | /enterprises/{enterprise_id} | Replace an enterprise |\n| POST | /enterprises/{enterprise_id}/branded_calling | Activate Branded Calling on an enterprise |\n| GET | /enterprises/{enterprise_id}/dir | List DIRs in an enterprise |\n| POST | /enterprises/{enterprise_id}/dir | Create a Display Identity Record (DIR) |\n| DELETE | /enterprises/{enterprise_id}/reputation | Disable phone-number reputation for an enterprise |\n| GET | /enterprises/{enterprise_id}/reputation | Get phone-number reputation settings for an enterprise |\n| POST | /enterprises/{enterprise_id}/reputation | Enable phone-number reputation for an enterprise |\n| PATCH | /enterprises/{enterprise_id}/reputation/frequency | Change the reputation refresh frequency |\n| PATCH | /enterprises/{enterprise_id}/reputation/loa | Replace the reputation Letter of Authorization document |\n| POST | /enterprises/{enterprise_id}/reputation/loa | Render a phone-number reputation Letter of Authorization |\n| GET | /enterprises/{enterprise_id}/reputation/numbers | List reputation-monitored phone numbers for an enterprise |\n| POST | /enterprises/{enterprise_id}/reputation/numbers | Register phone numbers for reputation monitoring |\n| POST | /enterprises/{enterprise_id}/reputation/numbers/refresh | Force a reputation refresh |\n| DELETE | /enterprises/{enterprise_id}/reputation/numbers/{phone_number} | Remove a phone number from reputation monitoring |\n| GET | /enterprises/{enterprise_id}/reputation/numbers/{phone_number} | Get a single reputation-monitored phone number |\n| GET | /enterprises/{enterprise_id}/reputation/remediation | List reputation remediation requests for an enterprise |\n| POST | /enterprises/{enterprise_id}/reputation/remediation | Submit phone numbers for reputation remediation |\n| GET | /enterprises/{enterprise_id}/reputation/remediation/{remediation_id} | Get a reputation remediation request |\n| POST | /enterprises/{enterprise_id}/verify_email | Send an email-ownership verification code to an enterprise |\n| POST | /enterprises/{enterprise_id}/verify_email/confirm | Confirm an enterprise email-ownership verification code |\n\n### External_connections\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /external_connections | List all External Connections |\n| POST | /external_connections | Creates an External Connection |\n| GET | /external_connections/log_messages | List all log messages |\n| DELETE | /external_connections/log_messages/{id} | Dismiss a log message |\n| GET | /external_connections/log_messages/{id} | Retrieve a log message |\n| DELETE | /external_connections/{id} | Deletes an External Connection |\n| GET | /external_connections/{id} | Retrieve an External Connection |\n| PATCH | /external_connections/{id} | Update an External Connection |\n| GET | /external_connections/{id}/civic_addresses | List all civic addresses and locations |\n| GET | /external_connections/{id}/civic_addresses/{address_id} | Retrieve a Civic Address |\n| PATCH | /external_connections/{id}/locations/{location_id} | Update a location's static emergency address |\n| GET | /external_connections/{id}/phone_numbers | List all phone numbers |\n| GET | /external_connections/{id}/phone_numbers/{phone_number_id} | Retrieve a phone number |\n| PATCH | /external_connections/{id}/phone_numbers/{phone_number_id} | Update a phone number |\n| GET | /external_connections/{id}/releases | List all Releases |\n| GET | /external_connections/{id}/releases/{release_id} | Retrieve a Release request |\n| GET | /external_connections/{id}/uploads | List all Upload requests |\n| POST | /external_connections/{id}/uploads | Creates an Upload request |\n| POST | /external_connections/{id}/uploads/refresh | Refresh the status of all Upload requests |\n| GET | /external_connections/{id}/uploads/status | Get the count of pending upload requests |\n| GET | /external_connections/{id}/uploads/{ticket_id} | Retrieve an Upload request |\n| POST | /external_connections/{id}/uploads/{ticket_id}/retry | Retry an Upload request |\n\n### External_requirements\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /external_requirements/{regulatory_requirement_id}/sub_number_orders/{sub_number_order_id} | Get action requirement details for a sub number order |\n| POST | /external_requirements/{regulatory_requirement_id}/sub_number_orders/{sub_number_order_id} | Fulfill an action requirement for a sub number order |\n\n### Fax_applications\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /fax_applications | List all Fax Applications |\n| POST | /fax_applications | Creates a Fax Application |\n| DELETE | /fax_applications/{id} | Deletes a Fax Application |\n| GET | /fax_applications/{id} | Retrieve a Fax Application |\n| PATCH | /fax_applications/{id} | Update a Fax Application |\n\n### Faxes\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /faxes | View a list of faxes |\n| POST | /faxes | Send a fax |\n| DELETE | /faxes/{id} | Delete a fax |\n| GET | /faxes/{id} | View a fax |\n| POST | /faxes/{id}/actions/cancel | Cancel a fax |\n| POST | /faxes/{id}/actions/refresh | Refresh a fax |\n\n### Fqdn_connections\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /fqdn_connections | List FQDN connections |\n| POST | /fqdn_connections | Create an FQDN connection |\n| GET | /fqdn_connections/{fqdn_connection_id}/fqdn_authentication | Retrieve an FQDN authentication |\n| PATCH | /fqdn_connections/{fqdn_connection_id}/fqdn_authentication | Update an FQDN authentication |\n| DELETE | /fqdn_connections/{id} | Delete an FQDN connection |\n| GET | /fqdn_connections/{id} | Retrieve an FQDN connection |\n| PATCH | /fqdn_connections/{id} | Update an FQDN connection |\n\n### Fqdns\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /fqdns | List FQDNs |\n| POST | /fqdns | Create an FQDN |\n| DELETE | /fqdns/{id} | Delete an FQDN |\n| GET | /fqdns/{id} | Retrieve an FQDN |\n| PATCH | /fqdns/{id} | Update an FQDN |\n\n### Global_ip_allowed_ports\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /global_ip_allowed_ports | List all Global IP Allowed Ports |\n\n### Global_ip_assignment_health\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /global_ip_assignment_health | Global IP Assignment Health Check Metrics |\n\n### Global_ip_assignments\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /global_ip_assignments | List all Global IP assignments |\n| POST | /global_ip_assignments | Create a Global IP assignment |\n| GET | /global_ip_assignments/usage | Global IP Assignment Usage Metrics |\n| DELETE | /global_ip_assignments/{id} | Delete a Global IP assignment |\n| GET | /global_ip_assignments/{id} | Retrieve a Global IP assignment |\n| PATCH | /global_ip_assignments/{id} | Update a Global IP assignment |\n\n### Global_ip_assignments_usage\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /global_ip_assignments_usage | Global IP Assignment Usage Metrics |\n\n### Global_ip_health_check_types\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /global_ip_health_check_types | List all Global IP Health check types |\n\n### Global_ip_health_checks\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /global_ip_health_checks | List all Global IP health checks |\n| POST | /global_ip_health_checks | Create a Global IP health check |\n| DELETE | /global_ip_health_checks/{id} | Delete a Global IP health check |\n| GET | /global_ip_health_checks/{id} | Retrieve a Global IP health check |\n\n### Global_ip_latency\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /global_ip_latency | Global IP Latency Metrics |\n\n### Global_ip_protocols\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /global_ip_protocols | List all Global IP Protocols |\n\n### Global_ip_usage\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /global_ip_usage | Global IP Usage Metrics |\n\n### Global_ips\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /global_ips | List all Global IPs |\n| POST | /global_ips | Create a Global IP |\n| DELETE | /global_ips/{id} | Delete a Global IP |\n| GET | /global_ips/{id} | Retrieve a Global IP |\n\n### Inbound_channels\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /inbound_channels | List your voice channels for US Zone |\n| PATCH | /inbound_channels | Update voice channels for US Zone |\n\n### Inexplicit_number_orders\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /inexplicit_number_orders | List inexplicit number orders |\n| POST | /inexplicit_number_orders | Create an inexplicit number order |\n| GET | /inexplicit_number_orders/{id} | Retrieve an inexplicit number order |\n\n### Infringement_claims\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /infringement_claims/{claim_id} | Get an infringement claim |\n| POST | /infringement_claims/{claim_id}/contest | Contest an infringement claim |\n\n### Integration_secrets\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /integration_secrets | List integration secrets |\n| POST | /integration_secrets | Create a secret |\n| DELETE | /integration_secrets/{id} | Delete an integration secret |\n\n### Inventory_coverage\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /inventory_coverage | Create an inventory coverage request |\n\n### Invoices\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /invoices | List invoices |\n| GET | /invoices/{id} | Get invoice by ID |\n\n### Ip_connections\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /ip_connections | List Ip connections |\n| POST | /ip_connections | Create an Ip connection |\n| DELETE | /ip_connections/{id} | Delete an Ip connection |\n| GET | /ip_connections/{id} | Retrieve an Ip connection |\n| PATCH | /ip_connections/{id} | Update an Ip connection |\n\n### Ips\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /ips | List Ips |\n| POST | /ips | Create an Ip |\n| DELETE | /ips/{id} | Delete an Ip |\n| GET | /ips/{id} | Retrieve an Ip |\n| PATCH | /ips/{id} | Update an Ip |\n\n### Ledger_billing_group_reports\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /ledger_billing_group_reports | Create a ledger billing group report |\n| GET | /ledger_billing_group_reports/{id} | Get a ledger billing group report |\n\n### Legacy\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /legacy/reporting/batch/detail/records/speech/to/text | Get all Speech to Text batch report requests |\n| POST | /legacy/reporting/batch/detail/records/speech/to/text | Create a new Speech to Text batch report request |\n| DELETE | /legacy/reporting/batch/detail/records/speech/to/text/{id} | Delete a Speech to Text batch report request |\n| GET | /legacy/reporting/batch/detail/records/speech/to/text/{id} | Get a specific Speech to Text batch report request |\n| GET | /legacy/reporting/batch_detail_records/messaging | Get all MDR detailed report requests |\n| POST | /legacy/reporting/batch_detail_records/messaging | Create a new MDR detailed report request |\n| DELETE | /legacy/reporting/batch_detail_records/messaging/{id} | Delete a MDR detailed report request |\n| GET | /legacy/reporting/batch_detail_records/messaging/{id} | Get a specific MDR detailed report request |\n| GET | /legacy/reporting/batch_detail_records/speech_to_text | Get all Speech to Text batch report requests |\n| POST | /legacy/reporting/batch_detail_records/speech_to_text | Create a new Speech to Text batch report request |\n| DELETE | /legacy/reporting/batch_detail_records/speech_to_text/{id} | Delete a Speech to Text batch report request |\n| GET | /legacy/reporting/batch_detail_records/speech_to_text/{id} | Get a specific Speech to Text batch report request |\n| GET | /legacy/reporting/batch_detail_records/voice | Get all CDR report requests |\n| POST | /legacy/reporting/batch_detail_records/voice | Create a new CDR report request |\n| GET | /legacy/reporting/batch_detail_records/voice/fields | Get available CDR report fields |\n| DELETE | /legacy/reporting/batch_detail_records/voice/{id} | Delete a CDR report request |\n| GET | /legacy/reporting/batch_detail_records/voice/{id} | Get a specific CDR report request |\n| GET | /legacy/reporting/usage_reports/messaging | List MDR usage reports |\n| POST | /legacy/reporting/usage_reports/messaging | Create a new legacy usage V2 MDR report request |\n| DELETE | /legacy/reporting/usage_reports/messaging/{id} | Delete a V2 legacy usage MDR report request |\n| GET | /legacy/reporting/usage_reports/messaging/{id} | Get an MDR usage report |\n| GET | /legacy/reporting/usage_reports/number_lookup | List telco data usage reports |\n| POST | /legacy/reporting/usage_reports/number_lookup | Submit telco data usage report |\n| DELETE | /legacy/reporting/usage_reports/number_lookup/{id} | Delete telco data usage report |\n| GET | /legacy/reporting/usage_reports/number_lookup/{id} | Get telco data usage report by ID |\n| GET | /legacy/reporting/usage_reports/speech_to_text | Get speech to text usage report |\n| GET | /legacy/reporting/usage_reports/voice | List CDR usage reports |\n| POST | /legacy/reporting/usage_reports/voice | Create a new legacy usage V2 CDR report request |\n| DELETE | /legacy/reporting/usage_reports/voice/{id} | Delete a V2 legacy usage CDR report request |\n| GET | /legacy/reporting/usage_reports/voice/{id} | Get a CDR usage report |\n\n### Legacy_reporting\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /legacy_reporting/batch_detail_records/messaging | Get all MDR detailed report requests |\n| POST | /legacy_reporting/batch_detail_records/messaging | Create a new MDR detailed report request |\n| DELETE | /legacy_reporting/batch_detail_records/messaging/{id} | Delete a MDR detailed report request |\n| GET | /legacy_reporting/batch_detail_records/messaging/{id} | Get a specific MDR detailed report request |\n| GET | /legacy_reporting/batch_detail_records/voice | Get all CDR report requests |\n| POST | /legacy_reporting/batch_detail_records/voice | Create a new CDR report request |\n| GET | /legacy_reporting/batch_detail_records/voice/fields | Get available CDR report fields |\n| DELETE | /legacy_reporting/batch_detail_records/voice/{id} | Delete a CDR report request |\n| GET | /legacy_reporting/batch_detail_records/voice/{id} | Get a specific CDR report request |\n| GET | /legacy_reporting/usage_reports/messaging | List MDR usage reports |\n| POST | /legacy_reporting/usage_reports/messaging | Create a new legacy usage V2 MDR report request |\n| DELETE | /legacy_reporting/usage_reports/messaging/{id} | Delete a V2 legacy usage MDR report request |\n| GET | /legacy_reporting/usage_reports/messaging/{id} | Get an MDR usage report |\n| GET | /legacy_reporting/usage_reports/number_lookup | List telco data usage reports |\n| POST | /legacy_reporting/usage_reports/number_lookup | Submit telco data usage report |\n| DELETE | /legacy_reporting/usage_reports/number_lookup/{id} | Delete telco data usage report |\n| GET | /legacy_reporting/usage_reports/number_lookup/{id} | Get telco data usage report by ID |\n| GET | /legacy_reporting/usage_reports/speech_to_text | Get speech to text usage report |\n| GET | /legacy_reporting/usage_reports/voice | List CDR usage reports |\n| POST | /legacy_reporting/usage_reports/voice | Create a new legacy usage V2 CDR report request |\n| DELETE | /legacy_reporting/usage_reports/voice/{id} | Delete a V2 legacy usage CDR report request |\n| GET | /legacy_reporting/usage_reports/voice/{id} | Get a CDR usage report |\n\n### List\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /list | List All Numbers using Channel Billing |\n| GET | /list/{channel_zone_id} | List Numbers using Channel Billing for a specific Zone |\n\n### Machine-payments\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /machine-payments/account-credit | Create a machine payment account credit |\n\n### Managed_accounts\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /managed_accounts | Lists accounts managed by the current user. |\n| POST | /managed_accounts | Create a new managed account. |\n| GET | /managed_accounts/allocatable_global_outbound_channels | Display information about allocatable global outbound channels for the current user. |\n| GET | /managed_accounts/{id} | Retrieve a managed account |\n| PATCH | /managed_accounts/{id} | Update a managed account |\n| POST | /managed_accounts/{id}/actions/disable | Disables a managed account |\n| POST | /managed_accounts/{id}/actions/enable | Enables a managed account |\n| PATCH | /managed_accounts/{id}/update_global_channel_limit | Update the amount of allocatable global outbound channels allocated to a specific managed account. |\n\n### Media\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /media | List uploaded media |\n| POST | /media | Upload media |\n| DELETE | /media/{media_name} | Deletes stored media |\n| GET | /media/{media_name} | Retrieve stored media |\n| PUT | /media/{media_name} | Update stored media |\n| GET | /media/{media_name}/download | Download stored media |\n\n### Meeting_sessions\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /meeting_sessions | List meeting sessions |\n| POST | /meeting_sessions | Create a meeting session |\n| DELETE | /meeting_sessions/{id} | Delete a meeting session |\n| GET | /meeting_sessions/{id} | Retrieve a meeting session |\n| PATCH | /meeting_sessions/{id} | Update a meeting session |\n| POST | /meeting_sessions/{id}/actions/send_chat | Send chat in a meeting session |\n| POST | /meeting_sessions/{id}/actions/speak | Speak in a meeting session |\n| POST | /meeting_sessions/{id}/actions/stop_speaking | Stop speaking in a meeting session |\n| GET | /meeting_sessions/{id}/artifacts | List meeting session artifacts |\n| POST | /meeting_sessions/{id}/artifacts | Create a meeting session artifact |\n| GET | /meeting_sessions/{id}/artifacts/{artifact_id} | Retrieve a meeting session artifact |\n| GET | /meeting_sessions/{id}/events | List meeting session events |\n| DELETE | /meeting_sessions/{id}/recording_media | Delete meeting session recording media |\n| GET | /meeting_sessions/{id}/recordings | List meeting session recordings |\n| GET | /meeting_sessions/{id}/transcript | List meeting session transcript |\n\n### Messages\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /messages | Send a message |\n| POST | /messages/alphanumeric/sender/id | Send a message using an alphanumeric sender ID |\n| POST | /messages/alphanumeric_sender_id | Send a message using an alphanumeric sender ID |\n| GET | /messages/group/{message_id} | Retrieve group MMS messages |\n| POST | /messages/group_mms | Send a group MMS message |\n| POST | /messages/long_code | Send a long code message |\n| POST | /messages/number_pool | Send a message using number pool |\n| POST | /messages/rcs | Send an RCS message |\n| GET | /messages/rcs/deeplinks/{agent_id} | Generate RCS deeplink |\n| GET | /messages/rcs_deeplinks/{agent_id} | Generate RCS deeplink |\n| POST | /messages/schedule | Schedule a message |\n| POST | /messages/short_code | Send a short code message |\n| POST | /messages/whatsapp | Send a Whatsapp message |\n| DELETE | /messages/{id} | Cancel a scheduled message |\n| GET | /messages/{id} | Retrieve a message |\n\n### Messaging\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /messaging/hosted/numbers | List messaging hosted numbers |\n| POST | /messaging/profiles/{id}/actions/regenerate/secret | Regenerate messaging profile secret |\n| GET | /messaging/profiles/{id}/alphanumeric/sender/ids | List alphanumeric sender IDs for a messaging profile |\n| GET | /messaging/profiles/{id}/metrics | Get detailed messaging profile metrics |\n| GET | /messaging/rcs/agents | List all RCS agents |\n| GET | /messaging/rcs/agents/{id} | Retrieve an RCS agent |\n| PATCH | /messaging/rcs/agents/{id} | Modify an RCS agent |\n| POST | /messaging/rcs/bulk_capabilities | Check RCS capabilities (batch) |\n| GET | /messaging/rcs/capabilities/{agent_id}/{phone_number} | Check RCS capabilities |\n| PUT | /messaging/rcs/test_number_invite/{id}/{phone_number} | Add RCS test number |\n| GET | /messaging/tollfree/verification/requests/{id}/status/history | Get Verification Request Status History |\n\n### Messaging_hosted_number_orders\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /messaging_hosted_number_orders | List messaging hosted number orders |\n| POST | /messaging_hosted_number_orders | Create a messaging hosted number order |\n| POST | /messaging_hosted_number_orders/eligibility_numbers_check | Check hosted messaging eligibility |\n| DELETE | /messaging_hosted_number_orders/{id} | Delete a messaging hosted number order |\n| GET | /messaging_hosted_number_orders/{id} | Retrieve a messaging hosted number order |\n| POST | /messaging_hosted_number_orders/{id}/actions/file_upload | Upload hosted number document |\n| POST | /messaging_hosted_number_orders/{id}/validation_codes | Validate hosted number codes |\n| POST | /messaging_hosted_number_orders/{id}/verification_codes | Create hosted number verification codes |\n\n### Messaging_hosted_numbers\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /messaging_hosted_numbers | List messaging hosted numbers |\n| DELETE | /messaging_hosted_numbers/{id} | Delete a messaging hosted number |\n| GET | /messaging_hosted_numbers/{id} | Retrieve a messaging hosted number |\n| PATCH | /messaging_hosted_numbers/{id} | Update a messaging hosted number |\n\n### Messaging_numbers\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /messaging_numbers/bulk_updates | Bulk update phone number profiles |\n| GET | /messaging_numbers/bulk_updates/{order_id} | Retrieve bulk update status |\n\n### Messaging_numbers_bulk_updates\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /messaging_numbers_bulk_updates | Bulk update phone number profiles |\n| GET | /messaging_numbers_bulk_updates/{order_id} | Retrieve bulk update status |\n\n### Messaging_optouts\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /messaging_optouts | List opt-outs |\n\n### Messaging_profile_metrics\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /messaging_profile_metrics | List high-level messaging profile metrics |\n\n### Messaging_profiles\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /messaging_profiles | List messaging profiles |\n| POST | /messaging_profiles | Create a messaging profile |\n| DELETE | /messaging_profiles/{id} | Delete a messaging profile |\n| GET | /messaging_profiles/{id} | Retrieve a messaging profile |\n| PATCH | /messaging_profiles/{id} | Update a messaging profile |\n| POST | /messaging_profiles/{id}/actions/regenerate_secret | Regenerate messaging profile secret |\n| GET | /messaging_profiles/{id}/alphanumeric_sender_ids | List alphanumeric sender IDs for a messaging profile |\n| GET | /messaging_profiles/{id}/metrics | Get detailed messaging profile metrics |\n| GET | /messaging_profiles/{id}/phone_numbers | List phone numbers associated with a messaging profile |\n| GET | /messaging_profiles/{id}/short_codes | List short codes associated with a messaging profile |\n| GET | /messaging_profiles/{profile_id}/autoresp_configs | List Auto-Response Settings |\n| POST | /messaging_profiles/{profile_id}/autoresp_configs | Create auto-response setting |\n| DELETE | /messaging_profiles/{profile_id}/autoresp_configs/{autoresp_cfg_id} | Delete Auto-Response Setting |\n| GET | /messaging_profiles/{profile_id}/autoresp_configs/{autoresp_cfg_id} | Get Auto-Response Setting |\n| PUT | /messaging_profiles/{profile_id}/autoresp_configs/{autoresp_cfg_id} | Update Auto-Response Setting |\n\n### Messaging_tollfree\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /messaging_tollfree/verification/requests | List Verification Requests |\n| POST | /messaging_tollfree/verification/requests | Submit Verification Request |\n| DELETE | /messaging_tollfree/verification/requests/{id} | Delete Verification Request |\n| GET | /messaging_tollfree/verification/requests/{id} | Get Verification Request |\n| PATCH | /messaging_tollfree/verification/requests/{id} | Update Verification Request |\n| GET | /messaging_tollfree/verification/requests/{id}/status_history | Get Verification Request Status History |\n\n### Messaging_url_domains\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /messaging_url_domains | List messaging URL domains |\n\n### Mobile_network_operators\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /mobile_network_operators | List mobile network operators |\n\n### Mobile_phone_numbers\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /mobile_phone_numbers/messaging | List mobile phone numbers with messaging settings |\n| GET | /mobile_phone_numbers/{id}/messaging | Retrieve a mobile phone number with messaging settings |\n| GET | /v2/mobile_phone_numbers | List Mobile Phone Numbers |\n| GET | /v2/mobile_phone_numbers/{id} | Retrieve a Mobile Phone Number |\n| PATCH | /v2/mobile_phone_numbers/{id} | Update a Mobile Phone Number |\n\n### Mobile_push_credentials\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /mobile_push_credentials | List mobile push credentials |\n| POST | /mobile_push_credentials | Creates a new mobile push credential |\n| DELETE | /mobile_push_credentials/{push_credential_id} | Deletes a mobile push credential |\n| GET | /mobile_push_credentials/{push_credential_id} | Retrieves a mobile push credential |\n\n### Network_coverage\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /network_coverage | List network coverage locations |\n\n### Networks\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /networks | List all Networks |\n| POST | /networks | Create a Network |\n| DELETE | /networks/{id} | Delete a Network |\n| GET | /networks/{id} | Retrieve a Network |\n| PATCH | /networks/{id} | Update a Network |\n| DELETE | /networks/{id}/default_gateway | Delete Default Gateway. |\n| GET | /networks/{id}/default_gateway | Get Default Gateway status. |\n| POST | /networks/{id}/default_gateway | Create Default Gateway. |\n| GET | /networks/{id}/network_interfaces | List all Interfaces for a Network. |\n\n### Noise_suppression_engines\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /noise_suppression_engines | List available noise suppression engines |\n\n### Notification_channels\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /notification_channels | List notification channels |\n| POST | /notification_channels | Create a notification channel |\n| DELETE | /notification_channels/{id} | Delete a notification channel |\n| GET | /notification_channels/{id} | Get a notification channel |\n| PATCH | /notification_channels/{id} | Update a notification channel |\n\n### Notification_event_conditions\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /notification_event_conditions | List all Notifications Events Conditions |\n\n### Notification_events\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /notification_events | List all Notifications Events |\n\n### Notification_profiles\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /notification_profiles | List all Notifications Profiles |\n| POST | /notification_profiles | Create a notification profile |\n| DELETE | /notification_profiles/{id} | Delete a notification profile |\n| GET | /notification_profiles/{id} | Get a notification profile |\n| PATCH | /notification_profiles/{id} | Update a notification profile |\n\n### Notification_settings\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /notification_settings | List notification settings |\n| POST | /notification_settings | Add a Notification Setting |\n| DELETE | /notification_settings/{id} | Delete a notification setting |\n| GET | /notification_settings/{id} | Get a notification setting |\n\n### Number_block_orders\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /number_block_orders | List number block orders |\n| POST | /number_block_orders | Create a number block order |\n| GET | /number_block_orders/{number_block_order_id} | Retrieve a number block order |\n\n### Number_lookup\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /number_lookup/{phone_number} | Lookup phone number data |\n\n### Number_order_phone_numbers\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /number_order_phone_numbers | Retrieve a list of phone numbers associated to orders |\n| POST | /number_order_phone_numbers/{id}/requirement_group | Update requirement group for a phone number order |\n| GET | /number_order_phone_numbers/{number_order_phone_number_id} | Retrieve a single phone number within a number order. |\n| PATCH | /number_order_phone_numbers/{number_order_phone_number_id} | Update requirements for a single phone number within a number order. |\n\n### Number_orders\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /number_orders | List number orders |\n| POST | /number_orders | Create a number order |\n| GET | /number_orders/{number_order_id} | Retrieve a number order |\n| PATCH | /number_orders/{number_order_id} | Update a number order |\n\n### Number_reservations\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /number_reservations | List number reservations |\n| POST | /number_reservations | Create a number reservation |\n| GET | /number_reservations/{number_reservation_id} | Retrieve a number reservation |\n| POST | /number_reservations/{number_reservation_id}/actions/extend | Extend a number reservation |\n\n### Numbers_features\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /numbers_features | Retrieve the features for a list of numbers |\n\n### Oauth\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /oauth/authorize | OAuth authorization endpoint |\n| GET | /oauth/clients | List OAuth clients |\n| POST | /oauth/clients | Create OAuth client |\n| DELETE | /oauth/clients/{id} | Delete OAuth client |\n| GET | /oauth/clients/{id} | Get OAuth client |\n| PUT | /oauth/clients/{id} | Update OAuth client |\n| GET | /oauth/consent/{consent_token} | Get OAuth consent token |\n| GET | /oauth/grants | List OAuth grants |\n| POST | /oauth/grants | Create OAuth grant |\n| DELETE | /oauth/grants/{id} | Revoke OAuth grant |\n| GET | /oauth/grants/{id} | Get OAuth grant |\n| POST | /oauth/introspect | Token introspection |\n| GET | /oauth/jwks | JSON Web Key Set |\n| POST | /oauth/register | Dynamic client registration |\n| POST | /oauth/token | OAuth token endpoint |\n\n### Oauth_clients\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /oauth_clients | List OAuth clients |\n| POST | /oauth_clients | Create OAuth client |\n| DELETE | /oauth_clients/{id} | Delete OAuth client |\n| GET | /oauth_clients/{id} | Get OAuth client |\n| PUT | /oauth_clients/{id} | Update OAuth client |\n\n### Oauth_grants\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /oauth_grants | List OAuth grants |\n| DELETE | /oauth_grants/{id} | Revoke OAuth grant |\n| GET | /oauth_grants/{id} | Get OAuth grant |\n\n### Operator_connect\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /operator_connect/actions/refresh | Refresh Operator Connect integration |\n\n### Organizations\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /organizations/users | List organization users |\n| GET | /organizations/users/users_groups_report | Get organization users groups report |\n| GET | /organizations/users/{id} | Get organization user |\n| POST | /organizations/users/{id}/actions/remove | Delete organization user |\n\n### Ota_updates\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /ota_updates | List OTA updates |\n| GET | /ota_updates/{id} | Get OTA update |\n\n### Outbound_voice_profiles\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /outbound_voice_profiles | Get all outbound voice profiles |\n| POST | /outbound_voice_profiles | Create an outbound voice profile |\n| DELETE | /outbound_voice_profiles/{id} | Delete an outbound voice profile |\n| GET | /outbound_voice_profiles/{id} | Retrieve an outbound voice profile |\n| PATCH | /outbound_voice_profiles/{id} | Updates an existing outbound voice profile. |\n\n### Payment\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /payment/auto_recharge_prefs | List auto recharge preferences |\n| PATCH | /payment/auto_recharge_prefs | Update auto recharge preferences |\n| POST | /v2/payment/stored_payment_transactions | Create a stored payment transaction |\n\n### Phone_number_blocks\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /phone_number_blocks/jobs | Lists the phone number blocks jobs |\n| POST | /phone_number_blocks/jobs/delete_phone_number_block | Deletes all numbers associated with a phone number block |\n| GET | /phone_number_blocks/jobs/{id} | Retrieves a phone number blocks job |\n\n### Phone_numbers\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /phone_numbers | List phone numbers |\n| POST | /phone_numbers/actions/verify_ownership | Verify ownership of phone numbers |\n| GET | /phone_numbers/csv_downloads | List CSV downloads |\n| POST | /phone_numbers/csv_downloads | Create a CSV download |\n| GET | /phone_numbers/csv_downloads/{id} | Retrieve a CSV download |\n| GET | /phone_numbers/jobs | Lists the phone numbers jobs |\n| POST | /phone_numbers/jobs/delete_phone_numbers | Delete a batch of numbers |\n| POST | /phone_numbers/jobs/update_emergency_settings | Update the emergency settings from a batch of numbers |\n| POST | /phone_numbers/jobs/update_phone_numbers | Update a batch of numbers |\n| GET | /phone_numbers/jobs/{id} | Retrieve a phone numbers job |\n| GET | /phone_numbers/messaging | List phone numbers with messaging settings |\n| GET | /phone_numbers/regulatory_requirements | Retrieve regulatory requirements for a list of phone numbers |\n| GET | /phone_numbers/slim | Slim List phone numbers |\n| GET | /phone_numbers/voice | List phone numbers with voice settings |\n| DELETE | /phone_numbers/{id} | Delete a phone number |\n| GET | /phone_numbers/{id} | Retrieve a phone number |\n| PATCH | /phone_numbers/{id} | Update a phone number |\n| PATCH | /phone_numbers/{id}/actions/bundle_status_change | Change the bundle status for a phone number (set to being in a bundle or remove from a bundle) |\n| POST | /phone_numbers/{id}/actions/enable_emergency | Enable emergency for a phone number |\n| GET | /phone_numbers/{id}/messaging | Retrieve a phone number with messaging settings |\n| PATCH | /phone_numbers/{id}/messaging | Update the messaging profile and/or messaging product of a phone number |\n| GET | /phone_numbers/{id}/voice | Retrieve a phone number with voice settings |\n| PATCH | /phone_numbers/{id}/voice | Update a phone number with voice settings |\n| GET | /phone_numbers/{phone_number_id}/voicemail | Get voicemail |\n| PATCH | /phone_numbers/{phone_number_id}/voicemail | Update voicemail |\n| POST | /phone_numbers/{phone_number_id}/voicemail | Create voicemail |\n\n### Phone_numbers_regulatory_requirements\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /phone_numbers_regulatory_requirements | Retrieve regulatory requirements for a list of phone numbers |\n\n### Portability_checks\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /portability_checks | Run a portability check |\n\n### Porting\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /porting/events | List all porting events |\n| GET | /porting/events/{id} | Show a porting event |\n| POST | /porting/events/{id}/republish | Republish a porting event |\n| GET | /porting/loa_configurations | List LOA configurations |\n| POST | /porting/loa_configurations | Create a LOA configuration |\n| POST | /porting/loa_configurations/preview | Preview the LOA configuration parameters |\n| DELETE | /porting/loa_configurations/{id} | Delete a LOA configuration |\n| GET | /porting/loa_configurations/{id} | Retrieve a LOA configuration |\n| PATCH | /porting/loa_configurations/{id} | Update a LOA configuration |\n| GET | /porting/loa_configurations/{id}/preview | Preview a LOA configuration |\n| GET | /porting/reports | List porting related reports |\n| POST | /porting/reports | Create a porting related report |\n| GET | /porting/reports/{id} | Retrieve a report |\n| GET | /porting/uk_carriers | List available carriers in the UK |\n\n### Porting_orders\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /porting_orders | List all porting orders |\n| POST | /porting_orders | Create a porting order |\n| GET | /porting_orders/exception_types | List all exception types |\n| GET | /porting_orders/phone_number_configurations | List all phone number configurations |\n| POST | /porting_orders/phone_number_configurations | Create a list of phone number configurations |\n| DELETE | /porting_orders/{id} | Delete a porting order |\n| GET | /porting_orders/{id} | Retrieve a porting order |\n| PATCH | /porting_orders/{id} | Edit a porting order |\n| POST | /porting_orders/{id}/actions/activate | Activate every number in a porting order asynchronously. |\n| POST | /porting_orders/{id}/actions/cancel | Cancel a porting order |\n| POST | /porting_orders/{id}/actions/confirm | Submit a porting order. |\n| POST | /porting_orders/{id}/actions/share | Share a porting order |\n| GET | /porting_orders/{id}/activation_jobs | List all porting activation jobs |\n| GET | /porting_orders/{id}/activation_jobs/{activationJobId} | Retrieve a porting activation job |\n| PATCH | /porting_orders/{id}/activation_jobs/{activationJobId} | Update a porting activation job |\n| GET | /porting_orders/{id}/additional_documents | List additional documents |\n| POST | /porting_orders/{id}/additional_documents | Create a list of additional documents |\n| DELETE | /porting_orders/{id}/additional_documents/{additional_document_id} | Delete an additional document |\n| GET | /porting_orders/{id}/allowed_foc_windows | List allowed FOC dates |\n| GET | /porting_orders/{id}/comments | List all comments of a porting order |\n| POST | /porting_orders/{id}/comments | Create a comment for a porting order |\n| GET | /porting_orders/{id}/loa_template | Download a porting order loa template |\n| GET | /porting_orders/{id}/requirements | List porting order requirements |\n| GET | /porting_orders/{id}/sub_request | Retrieve the associated V1 sub_request_id and port_request_id |\n| GET | /porting_orders/{id}/verification_codes | List verification codes |\n| POST | /porting_orders/{id}/verification_codes/send | Send the verification codes |\n| POST | /porting_orders/{id}/verification_codes/verify | Verify the verification code for a list of phone numbers |\n| GET | /porting_orders/{porting_order_id}/action_requirements | List action requirements for a porting order |\n| POST | /porting_orders/{porting_order_id}/action_requirements/{id}/initiate | Initiate an action requirement |\n| GET | /porting_orders/{porting_order_id}/associated_phone_numbers | List all associated phone numbers |\n| POST | /porting_orders/{porting_order_id}/associated_phone_numbers | Create an associated phone number |\n| DELETE | /porting_orders/{porting_order_id}/associated_phone_numbers/{id} | Delete an associated phone number |\n| GET | /porting_orders/{porting_order_id}/phone_number_blocks | List all phone number blocks |\n| POST | /porting_orders/{porting_order_id}/phone_number_blocks | Create a phone number block |\n| DELETE | /porting_orders/{porting_order_id}/phone_number_blocks/{id} | Delete a phone number block |\n| GET | /porting_orders/{porting_order_id}/phone_number_extensions | List all phone number extensions |\n| POST | /porting_orders/{porting_order_id}/phone_number_extensions | Create a phone number extension |\n| DELETE | /porting_orders/{porting_order_id}/phone_number_extensions/{id} | Delete a phone number extension |\n\n### Porting_phone_numbers\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /porting_phone_numbers | List all porting phone numbers |\n\n### Portouts\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /portouts | List portout requests |\n| GET | /portouts/events | List all port-out events |\n| GET | /portouts/events/{id} | Show a port-out event |\n| POST | /portouts/events/{id}/republish | Republish a port-out event |\n| GET | /portouts/rejections/{portout_id} | List eligible port-out rejection codes for a specific order |\n| GET | /portouts/reports | List port-out related reports |\n| POST | /portouts/reports | Create a port-out related report |\n| GET | /portouts/reports/{id} | Retrieve a report |\n| GET | /portouts/{id} | Get a portout request |\n| GET | /portouts/{id}/comments | List all comments for a portout request |\n| POST | /portouts/{id}/comments | Create a comment on a portout request |\n| GET | /portouts/{id}/supporting_documents | List supporting documents on a portout request |\n| POST | /portouts/{id}/supporting_documents | Create a list of supporting documents on a portout request |\n| PATCH | /portouts/{id}/{status} | Update Status |\n\n### Pricing\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /pricing/products | List products |\n| GET | /pricing/products/{slug} | Get product pricing |\n\n### Private_wireless_gateways\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /private_wireless_gateways | Get all Private Wireless Gateways |\n| POST | /private_wireless_gateways | Create a Private Wireless Gateway |\n| DELETE | /private_wireless_gateways/{id} | Delete a Private Wireless Gateway |\n| GET | /private_wireless_gateways/{id} | Get a Private Wireless Gateway |\n\n### Pronunciation_dicts\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /pronunciation_dicts | List pronunciation dictionaries |\n| POST | /pronunciation_dicts | Create a pronunciation dictionary |\n| DELETE | /pronunciation_dicts/{id} | Delete a pronunciation dictionary |\n| GET | /pronunciation_dicts/{id} | Get a pronunciation dictionary |\n| PATCH | /pronunciation_dicts/{id} | Update a pronunciation dictionary |\n\n### Public_internet_gateways\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /public_internet_gateways | List all Public Internet Gateways |\n| POST | /public_internet_gateways | Create a Public Internet Gateway |\n| DELETE | /public_internet_gateways/{id} | Delete a Public Internet Gateway |\n| GET | /public_internet_gateways/{id} | Retrieve a Public Internet Gateway |\n\n### Queues\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /queues | List queues |\n| POST | /queues | Create a queue |\n| DELETE | /queues/{queue_name} | Delete a queue |\n| GET | /queues/{queue_name} | Retrieve a call queue |\n| POST | /queues/{queue_name} | Update a queue |\n| GET | /queues/{queue_name}/calls | Retrieve calls from a queue |\n| DELETE | /queues/{queue_name}/calls/{call_control_id} | Force remove a call from a queue |\n| GET | /queues/{queue_name}/calls/{call_control_id} | Retrieve a call from a queue |\n| PATCH | /queues/{queue_name}/calls/{call_control_id} | Update queued call |\n\n### Rcs\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /rcs/agents | List RCS agents |\n| POST | /rcs/agents | Create an RCS agent |\n| GET | /rcs/agents/{id} | Retrieve an RCS agent |\n| PATCH | /rcs/agents/{id} | Update an RCS agent |\n| GET | /rcs/agents/{id}/carrier_approvals | List RCS agent carrier approvals |\n| POST | /rcs/agents/{id}/launch | Submit an RCS agent for launch |\n| POST | /rcs/agents/{id}/submit | Submit RCS agent basics |\n| GET | /rcs/agents/{id}/test_devices | List RCS agent test devices |\n| POST | /rcs/agents/{id}/test_devices | Add an RCS agent test device |\n| DELETE | /rcs/agents/{id}/test_devices/{test_device_id} | Remove an RCS agent test device |\n| GET | /rcs/brands | List RCS brands |\n| POST | /rcs/brands | Create an RCS brand |\n| GET | /rcs/brands/{id} | Retrieve an RCS brand |\n| PATCH | /rcs/brands/{id} | Update an RCS brand |\n| POST | /rcs/brands/{id}/submit | Submit an RCS brand |\n\n### Recording_transcriptions\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /recording_transcriptions | List all recording transcriptions |\n| DELETE | /recording_transcriptions/{recording_transcription_id} | Delete a recording transcription |\n| GET | /recording_transcriptions/{recording_transcription_id} | Retrieve a recording transcription |\n\n### Recordings\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /recordings | List all call recordings |\n| POST | /recordings/actions/delete | Delete a list of call recordings |\n| DELETE | /recordings/{recording_id} | Delete a call recording |\n| GET | /recordings/{recording_id} | Retrieve a call recording |\n\n### Regions\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /regions | List all Regions |\n\n### Regulatory_requirements\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /regulatory_requirements | Retrieve regulatory requirements |\n\n### Reports\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /reports/cdr_usage_reports/sync | Generates and fetches CDR Usage Reports |\n| GET | /reports/mdr_usage_reports | Fetch all Messaging usage reports |\n| POST | /reports/mdr_usage_reports | Create MDR Usage Report |\n| GET | /reports/mdr_usage_reports/sync | Generate and fetch MDR Usage Report |\n| DELETE | /reports/mdr_usage_reports/{id} | Delete MDR Usage Report |\n| GET | /reports/mdr_usage_reports/{id} | Retrieve messaging report |\n| GET | /reports/mdrs | Fetch all Mdr records |\n| GET | /reports/wdrs | Fetches all Wdr records |\n\n### Reputation\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /reputation/numbers | List reputation-monitored phone numbers across all enterprises |\n| DELETE | /reputation/numbers/{phone_number} | Remove a phone number from reputation monitoring (no enterprise_id required) |\n| GET | /reputation/numbers/{phone_number} | Get a reputation-monitored number (no enterprise_id required) |\n\n### Requirement_groups\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /requirement_groups | List requirement groups |\n| POST | /requirement_groups | Create a new requirement group |\n| DELETE | /requirement_groups/{id} | Delete a requirement group by ID |\n| GET | /requirement_groups/{id} | Get a single requirement group by ID |\n| PATCH | /requirement_groups/{id} | Update requirement values in requirement group |\n| POST | /requirement_groups/{id}/submit_for_approval | Submit a Requirement Group for Approval |\n\n### Requirement_types\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /requirement_types | List all requirement types |\n| GET | /requirement_types/{id} | Retrieve a requirement types |\n\n### Requirements\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /requirements | List all requirements |\n| GET | /requirements/{id} | Retrieve a document requirement |\n| POST | /requirements/{id}/versions | Schedule a future requirement version |\n| DELETE | /requirements/{id}/versions/pending | Cancel a pending requirement version |\n\n### Room_compositions\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /room_compositions | View a list of room compositions. |\n| POST | /room_compositions | Create a room composition. |\n| DELETE | /room_compositions/{room_composition_id} | Delete a room composition. |\n| GET | /room_compositions/{room_composition_id} | View a room composition. |\n\n### Room_participants\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /room_participants | View a list of room participants. |\n| GET | /room_participants/{room_participant_id} | View a room participant. |\n\n### Room_recordings\n| Method | Path | Description |\n|--------|------|-------------|\n| DELETE | /room_recordings | Delete several room recordings in a bulk. |\n| GET | /room_recordings | View a list of room recordings. |\n| DELETE | /room_recordings/{room_recording_id} | Delete a room recording. |\n| GET | /room_recordings/{room_recording_id} | View a room recording. |\n\n### Room_sessions\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /room_sessions | View a list of room sessions. |\n| GET | /room_sessions/{room_session_id} | View a room session. |\n| POST | /room_sessions/{room_session_id}/actions/end | End a room session. |\n| POST | /room_sessions/{room_session_id}/actions/kick | Kick participants from a room session. |\n| POST | /room_sessions/{room_session_id}/actions/mute | Mute participants in room session. |\n| POST | /room_sessions/{room_session_id}/actions/unmute | Unmute participants in room session. |\n| GET | /room_sessions/{room_session_id}/participants | View a list of room participants. |\n\n### Rooms\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /rooms | View a list of rooms. |\n| POST | /rooms | Create a room. |\n| DELETE | /rooms/{room_id} | Delete a room. |\n| GET | /rooms/{room_id} | View a room. |\n| PATCH | /rooms/{room_id} | Update a room. |\n| POST | /rooms/{room_id}/actions/generate_join_client_token | Create Client Token to join a room. |\n| POST | /rooms/{room_id}/actions/refresh_client_token | Refresh Client Token to join a room. |\n| GET | /rooms/{room_id}/sessions | View a list of room sessions. |\n\n### Session_analysis\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /session_analysis/metadata | Get metadata overview |\n| GET | /session_analysis/metadata/{record_type} | Get record type metadata |\n| GET | /session_analysis/{record_type}/{event_id} | Get session analysis |\n\n### Seti\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /seti/black_box_test_results | Retrieve Black Box Test Results |\n\n### Short_codes\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /short_codes | List short codes |\n| GET | /short_codes/{id} | Retrieve a short code |\n| PATCH | /short_codes/{id} | Update short code |\n\n### Sim_card_actions\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /sim_card_actions | List SIM card actions |\n| GET | /sim_card_actions/{id} | Get SIM card action details |\n\n### Sim_card_data_usage_notifications\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /sim_card_data_usage_notifications | List SIM card data usage notifications |\n| POST | /sim_card_data_usage_notifications | Create a new SIM card data usage notification |\n| DELETE | /sim_card_data_usage_notifications/{id} | Delete SIM card data usage notifications |\n| GET | /sim_card_data_usage_notifications/{id} | Get a single SIM card data usage notification |\n| PATCH | /sim_card_data_usage_notifications/{id} | Updates information for a SIM Card Data Usage Notification |\n\n### Sim_card_group_actions\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /sim_card_group_actions | List SIM card group actions |\n| GET | /sim_card_group_actions/{id} | Get SIM card group action details |\n\n### Sim_card_groups\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /sim_card_groups | Get all SIM card groups |\n| POST | /sim_card_groups | Create a SIM card group |\n| DELETE | /sim_card_groups/{id} | Delete a SIM card group |\n| GET | /sim_card_groups/{id} | Get SIM card group |\n| PATCH | /sim_card_groups/{id} | Update a SIM card group |\n| POST | /sim_card_groups/{id}/actions/remove_private_wireless_gateway | Request Private Wireless Gateway removal from SIM card group |\n| POST | /sim_card_groups/{id}/actions/remove_wireless_blocklist | Request Wireless Blocklist removal from SIM card group |\n| POST | /sim_card_groups/{id}/actions/set_private_wireless_gateway | Request Private Wireless Gateway assignment for SIM card group |\n| POST | /sim_card_groups/{id}/actions/set_wireless_blocklist | Request Wireless Blocklist assignment for SIM card group |\n\n### Sim_card_order_preview\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /sim_card_order_preview | Preview SIM card orders |\n\n### Sim_card_orders\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /sim_card_orders | Get all SIM card orders |\n| POST | /sim_card_orders | Create a SIM card order |\n| GET | /sim_card_orders/{id} | Get a single SIM card order |\n\n### Sim_cards\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /sim_cards | Get all SIM cards |\n| POST | /sim_cards/actions/bulk_disable_voice | Request bulk disabling voice on SIM cards. |\n| POST | /sim_cards/actions/bulk_enable_voice | Request bulk enabling voice on SIM cards. |\n| POST | /sim_cards/actions/bulk_set_public_ips | Request bulk setting SIM card public IPs. |\n| POST | /sim_cards/actions/validate_registration_codes | Validate SIM cards registration codes |\n| DELETE | /sim_cards/{id} | Deletes a SIM card |\n| GET | /sim_cards/{id} | Get SIM card |\n| PATCH | /sim_cards/{id} | Update a SIM card |\n| POST | /sim_cards/{id}/actions/disable | Request a SIM card disable |\n| POST | /sim_cards/{id}/actions/disable_voice | Request disabling voice on a SIM card |\n| POST | /sim_cards/{id}/actions/enable | Request a SIM card enable |\n| POST | /sim_cards/{id}/actions/enable_voice | Request enabling voice on a SIM card |\n| POST | /sim_cards/{id}/actions/remove_public_ip | Request removing a SIM card public IP |\n| POST | /sim_cards/{id}/actions/set_public_ip | Request setting a SIM card public IP |\n| POST | /sim_cards/{id}/actions/set_standby | Request setting a SIM card to standby |\n| GET | /sim_cards/{id}/activation_code | Get activation code for an eSIM |\n| GET | /sim_cards/{id}/device_details | Get SIM card device details |\n| GET | /sim_cards/{id}/public_ip | Get SIM card public IP definition |\n| GET | /sim_cards/{id}/wireless_connectivity_logs | List wireless connectivity logs |\n\n### Siprec_connectors\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /siprec_connectors | Create a SIPREC connector |\n| DELETE | /siprec_connectors/{connector_name} | Delete a SIPREC connector |\n| GET | /siprec_connectors/{connector_name} | Retrieve a SIPREC connector |\n| PUT | /siprec_connectors/{connector_name} | Update a SIPREC connector |\n\n### Speech-to-text\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /speech-to-text/providers | List supported STT providers |\n| GET | /speech-to-text/transcription | Speech to text over WebSocket |\n\n### Spend_limits\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /spend_limits | List spend limits |\n| POST | /spend_limits | Create a spend limit |\n| DELETE | /spend_limits/{product} | Delete a spend limit |\n| PATCH | /spend_limits/{product} | Update a spend limit |\n\n### Storage\n| Method | Path | Description |\n|--------|------|-------------|\n| DELETE | /storage/buckets/{bucketName}/ssl_certificate | Remove SSL Certificate |\n| GET | /storage/buckets/{bucketName}/ssl_certificate | Get Bucket SSL Certificate |\n| PUT | /storage/buckets/{bucketName}/ssl_certificate | Add SSL Certificate |\n| GET | /storage/buckets/{bucketName}/usage/api | Get API Usage |\n| GET | /storage/buckets/{bucketName}/usage/storage | Get Bucket Usage |\n| POST | /storage/buckets/{bucketName}/{objectName}/presigned_url | Create Presigned Object URL |\n| GET | /storage/cloudfs | List CloudFS filesystems |\n| POST | /storage/cloudfs | Create a CloudFS filesystem |\n| DELETE | /storage/cloudfs/{id} | Delete a CloudFS filesystem |\n| GET | /storage/cloudfs/{id} | Get a CloudFS filesystem |\n| PATCH | /storage/cloudfs/{id} | Update a CloudFS filesystem |\n| POST | /storage/cloudfs/{id}/actions/rotate-meta-token | Rotate the metadata token |\n| GET | /storage/kvs | List KV namespaces |\n| POST | /storage/kvs | Create a KV namespace |\n| DELETE | /storage/kvs/{id} | Delete a KV namespace |\n| GET | /storage/kvs/{id} | Get a KV namespace |\n| GET | /storage/kvs/{id}/keys | List keys |\n| DELETE | /storage/kvs/{id}/keys/{key} | Delete a key |\n| GET | /storage/kvs/{id}/keys/{key} | Get a key's value |\n| PUT | /storage/kvs/{id}/keys/{key} | Set a key's value |\n| GET | /storage/migration_source_coverage | List Migration Source coverage |\n| GET | /storage/migration_sources | List all Migration Sources |\n| POST | /storage/migration_sources | Create a Migration Source |\n| DELETE | /storage/migration_sources/{id} | Delete a Migration Source |\n| GET | /storage/migration_sources/{id} | Get a Migration Source |\n| GET | /storage/migrations | List all Migrations |\n| POST | /storage/migrations | Create a Migration |\n| GET | /storage/migrations/{id} | Get a Migration |\n| POST | /storage/migrations/{id}/actions/stop | Stop a Migration |\n| GET | /storage/sqldbs | List SQL databases |\n| POST | /storage/sqldbs | Create a SQL database |\n| DELETE | /storage/sqldbs/{id} | Delete a SQL database |\n| GET | /storage/sqldbs/{id} | Get a SQL database |\n| POST | /storage/sqldbs/{id}/actions/query | Run SQL against a SQL database |\n\n### Sub_number_orders\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /sub_number_orders | List sub number orders |\n| POST | /sub_number_orders/report | Create a sub number orders report |\n| GET | /sub_number_orders/report/{report_id} | Retrieve a sub number orders report |\n| GET | /sub_number_orders/report/{report_id}/download | Download a sub number orders report |\n| POST | /sub_number_orders/{id}/requirement_group | Update requirement group for a sub number order |\n| GET | /sub_number_orders/{sub_number_order_id} | Retrieve a sub number order |\n| PATCH | /sub_number_orders/{sub_number_order_id} | Update a sub number order's requirements |\n| PATCH | /sub_number_orders/{sub_number_order_id}/cancel | Cancel a sub number order |\n\n### Sub_number_orders_report\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /sub_number_orders_report | Create a sub number orders report |\n| GET | /sub_number_orders_report/{report_id} | Retrieve a sub number orders report |\n| GET | /sub_number_orders_report/{report_id}/download | Download a sub number orders report |\n\n### Telephony_credentials\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /telephony_credentials | List all credentials |\n| POST | /telephony_credentials | Create a credential |\n| DELETE | /telephony_credentials/{id} | Delete a credential |\n| GET | /telephony_credentials/{id} | Get a credential |\n| PATCH | /telephony_credentials/{id} | Update a credential |\n| POST | /telephony_credentials/{id}/token | Create an Access Token. |\n\n### Terms_of_service\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /terms_of_service/agreements | List the calling user's Terms of Service agreements |\n| GET | /terms_of_service/agreements/{agreement_id} | Get a Terms of Service agreement by id |\n| POST | /terms_of_service/branded_calling/agree | Agree to the Branded Calling Terms of Service |\n| GET | /terms_of_service/info | Get Terms of Service information |\n| POST | /terms_of_service/number_reputation/agree | Agree to the Phone Number Reputation Terms of Service |\n| GET | /terms_of_service/status | Get the calling user's Terms of Service status |\n\n### Texml\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /texml/Accounts/{account_sid}/Calls | Fetch multiple call resources |\n| POST | /texml/Accounts/{account_sid}/Calls | Initiate an outbound call |\n| GET | /texml/Accounts/{account_sid}/Calls/{call_sid} | Fetch a call |\n| POST | /texml/Accounts/{account_sid}/Calls/{call_sid} | Update call |\n| GET | /texml/Accounts/{account_sid}/Calls/{call_sid}/Recordings.json | Fetch recordings for a call |\n| POST | /texml/Accounts/{account_sid}/Calls/{call_sid}/Recordings.json | Request recording for a call |\n| POST | /texml/Accounts/{account_sid}/Calls/{call_sid}/Recordings/{recording_sid}.json | Update recording on a call |\n| POST | /texml/Accounts/{account_sid}/Calls/{call_sid}/Siprec.json | Request siprec session for a call |\n| POST | /texml/Accounts/{account_sid}/Calls/{call_sid}/Siprec/{siprec_sid}.json | Updates siprec session for a call |\n| POST | /texml/Accounts/{account_sid}/Calls/{call_sid}/Streams.json | Start streaming media from a call. |\n| POST | /texml/Accounts/{account_sid}/Calls/{call_sid}/Streams/{streaming_sid}.json | Update streaming on a call |\n| GET | /texml/Accounts/{account_sid}/Conferences | List conference resources |\n| GET | /texml/Accounts/{account_sid}/Conferences/{conference_sid} | Fetch a conference resource |\n| POST | /texml/Accounts/{account_sid}/Conferences/{conference_sid} | Update a conference resource |\n| GET | /texml/Accounts/{account_sid}/Conferences/{conference_sid}/Participants | List conference participants |\n| POST | /texml/Accounts/{account_sid}/Conferences/{conference_sid}/Participants | Dial a new conference participant |\n| DELETE | /texml/Accounts/{account_sid}/Conferences/{conference_sid}/Participants/{call_sid_or_participant_label} | Delete a conference participant |\n| GET | /texml/Accounts/{account_sid}/Conferences/{conference_sid}/Participants/{call_sid_or_participant_label} | Get conference participant resource |\n| POST | /texml/Accounts/{account_sid}/Conferences/{conference_sid}/Participants/{call_sid_or_participant_label} | Update a conference participant |\n| GET | /texml/Accounts/{account_sid}/Conferences/{conference_sid}/Recordings | List conference recordings |\n| GET | /texml/Accounts/{account_sid}/Conferences/{conference_sid}/Recordings.json | Fetch recordings for a conference |\n| GET | /texml/Accounts/{account_sid}/Queues | List queue resources |\n| POST | /texml/Accounts/{account_sid}/Queues | Create a new queue |\n| DELETE | /texml/Accounts/{account_sid}/Queues/{queue_sid} | Delete a queue resource |\n| GET | /texml/Accounts/{account_sid}/Queues/{queue_sid} | Fetch a queue resource |\n| POST | /texml/Accounts/{account_sid}/Queues/{queue_sid} | Update a queue resource |\n| GET | /texml/Accounts/{account_sid}/Recordings.json | Fetch multiple recording resources |\n| DELETE | /texml/Accounts/{account_sid}/Recordings/{recording_sid}.json | Delete recording resource |\n| GET | /texml/Accounts/{account_sid}/Recordings/{recording_sid}.json | Fetch recording resource |\n| GET | /texml/Accounts/{account_sid}/Transcriptions.json | List recording transcriptions |\n| DELETE | /texml/Accounts/{account_sid}/Transcriptions/{recording_transcription_sid}.json | Delete a recording transcription |\n| GET | /texml/Accounts/{account_sid}/Transcriptions/{recording_transcription_sid}.json | Fetch a recording transcription resource |\n| POST | /texml/ai_calls/{connection_id} | Initiate an outbound AI call |\n| POST | /texml/calls/{connection_id} | Create a connection-scoped TeXML call |\n| POST | /texml/secrets | Create a TeXML secret |\n\n### Texml_applications\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /texml_applications | List all TeXML Applications |\n| POST | /texml_applications | Creates a TeXML Application |\n| DELETE | /texml_applications/{id} | Deletes a TeXML Application |\n| GET | /texml_applications/{id} | Retrieve a TeXML Application |\n| PATCH | /texml_applications/{id} | Update a TeXML Application |\n\n### Text-to-speech\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /text-to-speech/speech | Stream text to speech over WebSocket |\n| POST | /text-to-speech/speech | Generate speech from text |\n| GET | /text-to-speech/voices | List available voices |\n\n### Traffic\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /traffic/policy/profiles | Get all traffic policy profiles |\n| POST | /traffic/policy/profiles | Create a traffic policy profile |\n| GET | /traffic/policy/profiles/services | Get all available traffic policy profile services |\n| DELETE | /traffic/policy/profiles/{id} | Delete a traffic policy profile |\n| GET | /traffic/policy/profiles/{id} | Get a traffic policy profile |\n| PATCH | /traffic/policy/profiles/{id} | Update a traffic policy profile |\n\n### Traffic_policy_profiles\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /traffic_policy_profiles | Get all traffic policy profiles |\n| POST | /traffic_policy_profiles | Create a traffic policy profile |\n| GET | /traffic_policy_profiles/services | Get all available traffic policy profile services |\n| DELETE | /traffic_policy_profiles/{id} | Delete a traffic policy profile |\n| GET | /traffic_policy_profiles/{id} | Get a traffic policy profile |\n| PATCH | /traffic_policy_profiles/{id} | Update a traffic policy profile |\n\n### Uac_connections\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /uac_connections | List UAC connections |\n| POST | /uac_connections | Create a UAC connection |\n| DELETE | /uac_connections/{id} | Delete a UAC connection |\n| GET | /uac_connections/{id} | Retrieve a UAC connection |\n| PATCH | /uac_connections/{id} | Update a UAC connection |\n| POST | /uac_connections/{id}/actions/check_registration_status | Check a UAC Connection Registration Status |\n\n### Usage_reports\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /usage_reports | Get Telnyx product usage data (BETA) |\n| GET | /usage_reports/options | Get Usage Reports query options (BETA) |\n\n### User\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /user/addresses | List all user addresses |\n| POST | /user/addresses | Creates a user address |\n| GET | /user/addresses/{id} | Retrieve a user address |\n\n### User_addresses\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /user_addresses | List all user addresses |\n| POST | /user_addresses | Creates a user address |\n| GET | /user_addresses/{id} | Retrieve a user address |\n\n### User_tags\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /user_tags | List User Tags |\n\n### Bot_challenge\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /v2/bot_challenge | Issue a bot challenge |\n\n### Bot_sessions\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v2/bot_sessions | Exchange a magic link token for a session |\n\n### Bot_signup\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /v2/bot_signup | Register via bot signup |\n| POST | /v2/bot_signup/resend_magic_link | Resend a bot signup magic link |\n\n### Mobile_voice_connections\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v2/mobile_voice_connections | List Mobile Voice Connections |\n| POST | /v2/mobile_voice_connections | Create a Mobile Voice Connection |\n| DELETE | /v2/mobile_voice_connections/{id} | Delete a Mobile Voice Connection |\n| GET | /v2/mobile_voice_connections/{id} | Retrieve a Mobile Voice Connection |\n| PATCH | /v2/mobile_voice_connections/{id} | Update a Mobile Voice Connection |\n\n### Whatsapp\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v2/whatsapp/business_accounts | List Whatsapp Business Accounts |\n| DELETE | /v2/whatsapp/business_accounts/{id} | Delete a Whatsapp Business Account |\n| GET | /v2/whatsapp/business_accounts/{id} | Get a single Whatsapp Business Account |\n| GET | /v2/whatsapp/business_accounts/{id}/phone_numbers | List phone numbers for a WABA |\n| POST | /v2/whatsapp/business_accounts/{id}/phone_numbers | Initialize Whatsapp phone number verification |\n| GET | /v2/whatsapp/business_accounts/{id}/settings | Get WABA settings |\n| PATCH | /v2/whatsapp/business_accounts/{id}/settings | Update WABA settings |\n| GET | /v2/whatsapp/message_templates | List Whatsapp message templates |\n| POST | /v2/whatsapp/message_templates | Create a Whatsapp message template |\n| GET | /v2/whatsapp/phone_numbers | List Whatsapp phone numbers |\n| DELETE | /v2/whatsapp/phone_numbers/{phone_number} | Delete a Whatsapp phone number |\n| GET | /v2/whatsapp/phone_numbers/{phone_number} | Retrieve a WhatsApp phone number |\n| GET | /v2/whatsapp/phone_numbers/{phone_number}/calling_settings | Get calling settings for a phone number |\n| PATCH | /v2/whatsapp/phone_numbers/{phone_number}/calling_settings | Enable or disable Whatsapp calling for a phone number |\n| GET | /v2/whatsapp/phone_numbers/{phone_number}/conversation_window | Get conversation window status for a phone number |\n| GET | /v2/whatsapp/phone_numbers/{phone_number}/conversational_components | Get phone number conversational components |\n| PATCH | /v2/whatsapp/phone_numbers/{phone_number}/conversational_components | Update phone number conversational components |\n| GET | /v2/whatsapp/phone_numbers/{phone_number}/profile | Get phone number business profile |\n| PATCH | /v2/whatsapp/phone_numbers/{phone_number}/profile | Update phone number business profile |\n| DELETE | /v2/whatsapp/phone_numbers/{phone_number}/profile/photo | Delete Whatsapp profile photo |\n| GET | /v2/whatsapp/phone_numbers/{phone_number}/profile/photo | Get Whatsapp profile photo |\n| POST | /v2/whatsapp/phone_numbers/{phone_number}/profile/photo | Upload Whatsapp profile photo |\n| POST | /v2/whatsapp/phone_numbers/{phone_number}/resend_verification | Resend verification code |\n| POST | /v2/whatsapp/phone_numbers/{phone_number}/verify | Submit verification code for a phone number |\n| GET | /v2/whatsapp/user_data | Fetch Whatsapp user data |\n| PATCH | /v2/whatsapp/user_data | Update Whatsapp user data |\n| GET | /whatsapp/business_accounts | List Whatsapp Business Accounts |\n| DELETE | /whatsapp/business_accounts/{id} | Delete a Whatsapp Business Account |\n| GET | /whatsapp/business_accounts/{id} | Get a single Whatsapp Business Account |\n| GET | /whatsapp/business_accounts/{id}/phone_numbers | List phone numbers for a WABA |\n| POST | /whatsapp/business_accounts/{id}/phone_numbers | Initialize Whatsapp phone number verification |\n| GET | /whatsapp/business_accounts/{id}/settings | Get WABA settings |\n| PATCH | /whatsapp/business_accounts/{id}/settings | Update WABA settings |\n| GET | /whatsapp/message_templates | List Whatsapp message templates |\n| POST | /whatsapp/message_templates | Create a Whatsapp message template |\n| DELETE | /whatsapp/message_templates/{id} | Delete a Whatsapp message template |\n| GET | /whatsapp/message_templates/{id} | Get a Whatsapp message template by ID |\n| PATCH | /whatsapp/message_templates/{id} | Update a Whatsapp message template |\n| GET | /whatsapp/phone_numbers | List Whatsapp phone numbers |\n| DELETE | /whatsapp/phone_numbers/{phone_number} | Delete a Whatsapp phone number |\n| GET | /whatsapp/phone_numbers/{phone_number} | Retrieve a WhatsApp phone number |\n| GET | /whatsapp/phone_numbers/{phone_number}/calling_settings | Get calling settings for a phone number |\n| PATCH | /whatsapp/phone_numbers/{phone_number}/calling_settings | Enable or disable Whatsapp calling for a phone number |\n| GET | /whatsapp/phone_numbers/{phone_number}/conversation_window | Get conversation window status for a phone number |\n| GET | /whatsapp/phone_numbers/{phone_number}/conversational_components | Get phone number conversational components |\n| PATCH | /whatsapp/phone_numbers/{phone_number}/conversational_components | Update phone number conversational components |\n| GET | /whatsapp/phone_numbers/{phone_number}/profile | Get phone number business profile |\n| PATCH | /whatsapp/phone_numbers/{phone_number}/profile | Update phone number business profile |\n| DELETE | /whatsapp/phone_numbers/{phone_number}/profile/photo | Delete Whatsapp profile photo |\n| GET | /whatsapp/phone_numbers/{phone_number}/profile/photo | Get Whatsapp profile photo |\n| POST | /whatsapp/phone_numbers/{phone_number}/profile/photo | Upload Whatsapp profile photo |\n| POST | /whatsapp/phone_numbers/{phone_number}/resend_verification | Resend verification code |\n| POST | /whatsapp/phone_numbers/{phone_number}/verify | Submit verification code for a phone number |\n\n### Whatsapp_message_templates\n| Method | Path | Description |\n|--------|------|-------------|\n| DELETE | /v2/whatsapp_message_templates/{id} | Delete a Whatsapp message template |\n| GET | /v2/whatsapp_message_templates/{id} | Get a Whatsapp message template by ID |\n| PATCH | /v2/whatsapp_message_templates/{id} | Update a Whatsapp message template |\n\n### Verifications\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /verifications/by_phone_number/{phone_number} | List verifications by phone number |\n| POST | /verifications/by_phone_number/{phone_number}/actions/verify | Verify verification code by phone number |\n| POST | /verifications/call | Trigger Call verification |\n| POST | /verifications/flashcall | Trigger Flash call verification |\n| POST | /verifications/sms | Trigger SMS verification |\n| POST | /verifications/whatsapp | Trigger WhatsApp verification |\n| GET | /verifications/{verification_id} | Retrieve verification |\n| POST | /verifications/{verification_id}/actions/verify | Verify verification code by ID |\n\n### Verified_numbers\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /verified_numbers | List all Verified Numbers |\n| POST | /verified_numbers | Request phone number verification |\n| DELETE | /verified_numbers/{phone_number} | Delete a verified number |\n| GET | /verified_numbers/{phone_number} | Retrieve a verified number |\n| POST | /verified_numbers/{phone_number}/actions/verify | Submit verification code |\n\n### Verify_profiles\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /verify_profiles | List all Verify profiles |\n| POST | /verify_profiles | Create a Verify profile |\n| GET | /verify_profiles/templates | Retrieve Verify profile message templates |\n| POST | /verify_profiles/templates | Create message template |\n| PATCH | /verify_profiles/templates/{template_id} | Update message template |\n| DELETE | /verify_profiles/{verify_profile_id} | Delete Verify profile |\n| GET | /verify_profiles/{verify_profile_id} | Retrieve Verify profile |\n| PATCH | /verify_profiles/{verify_profile_id} | Update Verify profile |\n\n### Virtual_cross_connects\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /virtual_cross_connects | List all Virtual Cross Connects |\n| POST | /virtual_cross_connects | Create a Virtual Cross Connect |\n| GET | /virtual_cross_connects/coverage | List Virtual Cross Connect Cloud Coverage |\n| DELETE | /virtual_cross_connects/{id} | Delete a Virtual Cross Connect |\n| GET | /virtual_cross_connects/{id} | Retrieve a Virtual Cross Connect |\n| PATCH | /virtual_cross_connects/{id} | Update the Virtual Cross Connect |\n\n### Virtual_cross_connects_coverage\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /virtual_cross_connects_coverage | List Virtual Cross Connect Cloud Coverage |\n\n### Voice_clones\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /voice_clones | List voice clones |\n| POST | /voice_clones | Create a voice clone from a voice design |\n| POST | /voice_clones/from_upload | Create a voice clone from an audio file upload |\n| DELETE | /voice_clones/{id} | Delete a voice clone |\n| PATCH | /voice_clones/{id} | Update a voice clone |\n| GET | /voice_clones/{id}/sample | Download voice clone audio sample |\n\n### Voice_designs\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /voice_designs | List voice designs |\n| POST | /voice_designs | Create or add a version to a voice design |\n| DELETE | /voice_designs/{id} | Delete a voice design |\n| GET | /voice_designs/{id} | Get a voice design |\n| PATCH | /voice_designs/{id} | Rename a voice design |\n| GET | /voice_designs/{id}/sample | Download voice design audio sample |\n| DELETE | /voice_designs/{id}/versions/{version} | Delete a specific version of a voice design |\n\n### Voice_sdk_call_reports\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /voice_sdk_call_reports | List Voice SDK call reports |\n| GET | /voice_sdk_call_reports/{call_id} | Retrieve Voice SDK call reports by call ID |\n\n### Web_search\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /web_search | Web search |\n| POST | /web_search/contents | Retrieve page contents |\n| POST | /web_search/research | Start research task |\n| GET | /web_search/research/{task_id} | Get research task status |\n\n### Webhook_deliveries\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /webhook_deliveries | List webhook deliveries |\n| GET | /webhook_deliveries/{id} | Find webhook_delivery details by ID |\n\n### Wireguard_interfaces\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /wireguard_interfaces | List all WireGuard Interfaces |\n| POST | /wireguard_interfaces | Create a WireGuard Interface |\n| DELETE | /wireguard_interfaces/{id} | Delete a WireGuard Interface |\n| GET | /wireguard_interfaces/{id} | Retrieve a WireGuard Interfaces |\n\n### Wireguard_peers\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /wireguard_peers | List all WireGuard Peers |\n| POST | /wireguard_peers | Create a WireGuard Peer |\n| DELETE | /wireguard_peers/{id} | Delete the WireGuard Peer |\n| GET | /wireguard_peers/{id} | Retrieve the WireGuard Peer |\n| PATCH | /wireguard_peers/{id} | Update the WireGuard Peer |\n| GET | /wireguard_peers/{id}/config | Retrieve Wireguard config template for Peer |\n\n### Wireless\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /wireless/detail/records/reports | Get all Wireless Detail Records (WDRs) Reports |\n| POST | /wireless/detail/records/reports | Create a Wireless Detail Records (WDRs) Report |\n| DELETE | /wireless/detail/records/reports/{id} | Delete a Wireless Detail Record (WDR) Report |\n| GET | /wireless/detail/records/reports/{id} | Get a Wireless Detail Record (WDR) Report |\n| GET | /wireless/detail_records_reports | Get all Wireless Detail Records (WDRs) Reports |\n| POST | /wireless/detail_records_reports | Create a Wireless Detail Records (WDRs) Report |\n| DELETE | /wireless/detail_records_reports/{id} | Delete a Wireless Detail Record (WDR) Report |\n| GET | /wireless/detail_records_reports/{id} | Get a Wireless Detail Record (WDR) Report |\n| GET | /wireless/regions | Get all wireless regions |\n\n### Wireless_blocklist_values\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /wireless_blocklist_values | Get all possible wireless blocklist values |\n\n### Wireless_blocklists\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /wireless_blocklists | Get all Wireless Blocklists |\n| POST | /wireless_blocklists | Create a Wireless Blocklist |\n| DELETE | /wireless_blocklists/{id} | Delete a Wireless Blocklist |\n| GET | /wireless_blocklists/{id} | Get a Wireless Blocklist |\n| PATCH | /wireless_blocklists/{id} | Update a Wireless Blocklist |\n\n### X402\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /x402/credit_account | Settle a payment |\n| GET | /x402/credit_account/payments | List x402 payments |\n| GET | /x402/credit_account/payments/{id} | Get an x402 payment |\n| POST | /x402/credit_account/quote | Create a payment quote |\n\n## Common Questions\nMatch user requests to endpoints in references/api-spec.lap. Key patterns:\n- \"List all oauth-authorization-server?\" -> GET /.well-known/oauth-authorization-server\n- \"List all oauth-protected-resource?\" -> GET /.well-known/oauth-protected-resource\n- \"List all brand?\" -> GET /10dlc/brand\n- \"Create a brand?\" -> POST /10dlc/brand\n- \"Get feedback details?\" -> GET /10dlc/brand/feedback/{brandId}\n- \"Get smsOtp details?\" -> GET /10dlc/brand/smsOtp/{referenceId}\n- \"Delete a brand?\" -> DELETE /10dlc/brand/{brandId}\n- \"Get brand details?\" -> GET /10dlc/brand/{brandId}\n- \"Update a brand?\" -> PUT /10dlc/brand/{brandId}\n- \"Create a 2faEmail?\" -> POST /10dlc/brand/{brandId}/2faEmail\n- \"List all externalVetting?\" -> GET /10dlc/brand/{brandId}/externalVetting\n- \"Create a externalVetting?\" -> POST /10dlc/brand/{brandId}/externalVetting\n- \"List all smsOtp?\" -> GET /10dlc/brand/{brandId}/smsOtp\n- \"Create a smsOtp?\" -> POST /10dlc/brand/{brandId}/smsOtp\n- \"Get brand_feedback details?\" -> GET /10dlc/brand_feedback/{brandId}\n- \"List all campaign?\" -> GET /10dlc/campaign\n- \"List all cost?\" -> GET /10dlc/campaign/usecase/cost\n- \"List all usecase_cost?\" -> GET /10dlc/campaign/usecase_cost\n- \"Delete a campaign?\" -> DELETE /10dlc/campaign/{campaignId}\n- \"Get campaign details?\" -> GET /10dlc/campaign/{campaignId}\n- \"Update a campaign?\" -> PUT /10dlc/campaign/{campaignId}\n- \"Create a appeal?\" -> POST /10dlc/campaign/{campaignId}/appeal\n- \"List all mnoMetadata?\" -> GET /10dlc/campaign/{campaignId}/mnoMetadata\n- \"List all operationStatus?\" -> GET /10dlc/campaign/{campaignId}/operationStatus\n- \"List all attributes?\" -> GET /10dlc/campaign/{campaignId}/osr/attributes\n- \"List all osr_attributes?\" -> GET /10dlc/campaign/{campaignId}/osr_attributes\n- \"List all sharing?\" -> GET /10dlc/campaign/{campaignId}/sharing\n- \"Create a campaignBuilder?\" -> POST /10dlc/campaignBuilder\n- \"Get usecase details?\" -> GET /10dlc/campaignBuilder/brand/{brandId}/usecase/{usecase}\n- \"Get enum details?\" -> GET /10dlc/enum/{endpoint}\n- \"List all sharedByMe?\" -> GET /10dlc/partnerCampaign/sharedByMe\n- \"List all partner_campaigns?\" -> GET /10dlc/partner_campaigns\n- \"Get partner_campaign details?\" -> GET /10dlc/partner_campaigns/{campaignId}\n- \"Partially update a partner_campaign?\" -> PATCH /10dlc/partner_campaigns/{campaignId}\n- \"Create a phoneNumberAssignmentByProfile?\" -> POST /10dlc/phoneNumberAssignmentByProfile\n- \"Get phoneNumberAssignmentByProfile details?\" -> GET /10dlc/phoneNumberAssignmentByProfile/{taskId}\n- \"List all phoneNumbers?\" -> GET /10dlc/phoneNumberAssignmentByProfile/{taskId}/phoneNumbers\n- \"List all phone_number_campaigns?\" -> GET /10dlc/phone_number_campaigns\n- \"Create a phone_number_campaign?\" -> POST /10dlc/phone_number_campaigns\n- \"Delete a phone_number_campaign?\" -> DELETE /10dlc/phone_number_campaigns/{phoneNumber}\n- \"Get phone_number_campaign details?\" -> GET /10dlc/phone_number_campaigns/{phoneNumber}\n- \"Update a phone_number_campaign?\" -> PUT /10dlc/phone_number_campaigns/{phoneNumber}\n- \"List all access_ip_address?\" -> GET /access_ip_address\n- \"Create a access_ip_address?\" -> POST /access_ip_address\n- \"Delete a access_ip_address?\" -> DELETE /access_ip_address/{access_ip_address_id}\n- \"Get access_ip_address details?\" -> GET /access_ip_address/{access_ip_address_id}\n- \"List all access_ip_ranges?\" -> GET /access_ip_ranges\n- \"Create a access_ip_range?\" -> POST /access_ip_ranges\n- \"Delete a access_ip_range?\" -> DELETE /access_ip_ranges/{access_ip_range_id}\n- \"Create a esim?\" -> POST /actions/purchase/esims\n- \"Create a sim_card?\" -> POST /actions/register/sim_cards\n- \"List all addresses?\" -> GET /addresses\n- \"Create a addresse?\" -> POST /addresses\n- \"Create a validate?\" -> POST /addresses/actions/validate\n- \"Delete a addresse?\" -> DELETE /addresses/{id}\n- \"Get addresse details?\" -> GET /addresses/{id}\n- \"Create a accept_suggestion?\" -> POST /addresses/{id}/actions/accept_suggestions\n- \"List all advanced_orders?\" -> GET /advanced_orders\n- \"Create a advanced_order?\" -> POST /advanced_orders\n- \"Get advanced_order details?\" -> GET /advanced_orders/{order_id}\n- \"Create a message?\" -> POST /ai/anthropic/v1/messages\n- \"List all assistants?\" -> GET /ai/assistants\n- \"Create a assistant?\" -> POST /ai/assistants\n- \"Create a import?\" -> POST /ai/assistants/import\n- \"List all tags?\" -> GET /ai/assistants/tags\n- \"List all tests?\" -> GET /ai/assistants/tests\n- \"Create a test?\" -> POST /ai/assistants/tests\n- \"List all test-suites?\" -> GET /ai/assistants/tests/test-suites\n- \"List all runs?\" -> GET /ai/assistants/tests/test-suites/{suite_name}/runs\n- \"Create a run?\" -> POST /ai/assistants/tests/test-suites/{suite_name}/runs\n- \"Delete a test?\" -> DELETE /ai/assistants/tests/{test_id}\n- \"Get test details?\" -> GET /ai/assistants/tests/{test_id}\n- \"Update a test?\" -> PUT /ai/assistants/tests/{test_id}\n- \"Get run details?\" -> GET /ai/assistants/tests/{test_id}/runs/{run_id}\n- \"Delete a assistant?\" -> DELETE /ai/assistants/{assistant_id}\n- \"Get assistant details?\" -> GET /ai/assistants/{assistant_id}\n- \"List all canary-deploys?\" -> GET /ai/assistants/{assistant_id}/canary-deploys\n- \"Create a canary-deploy?\" -> POST /ai/assistants/{assistant_id}/canary-deploys\n- \"Create a chat?\" -> POST /ai/assistants/{assistant_id}/chat\n- \"Create a sm?\" -> POST /ai/assistants/{assistant_id}/chat/sms\n- \"Create a clone?\" -> POST /ai/assistants/{assistant_id}/clone\n- \"Create a enhance?\" -> POST /ai/assistants/{assistant_id}/instructions/enhance\n- \"List all scheduled_events?\" -> GET /ai/assistants/{assistant_id}/scheduled_events\n- \"Create a scheduled_event?\" -> POST /ai/assistants/{assistant_id}/scheduled_events\n- \"Delete a scheduled_event?\" -> DELETE /ai/assistants/{assistant_id}/scheduled_events/{event_id}\n- \"Get scheduled_event details?\" -> GET /ai/assistants/{assistant_id}/scheduled_events/{event_id}\n- \"Create a tag?\" -> POST /ai/assistants/{assistant_id}/tags\n- \"Delete a tag?\" -> DELETE /ai/assistants/{assistant_id}/tags/{tag}\n- \"List all texml?\" -> GET /ai/assistants/{assistant_id}/texml\n- \"Delete a tool?\" -> DELETE /ai/assistants/{assistant_id}/tools/{tool_id}\n- \"Update a tool?\" -> PUT /ai/assistants/{assistant_id}/tools/{tool_id}\n- \"List all versions?\" -> GET /ai/assistants/{assistant_id}/versions\n- \"Delete a version?\" -> DELETE /ai/assistants/{assistant_id}/versions/{version_id}\n- \"Get version details?\" -> GET /ai/assistants/{assistant_id}/versions/{version_id}\n- \"Create a promote?\" -> POST /ai/assistants/{assistant_id}/versions/{version_id}/promote\n- \"Create a transcription?\" -> POST /ai/audio/transcriptions\n- \"Create a completion?\" -> POST /ai/chat/completions\n- \"List all clusters?\" -> GET /ai/clusters\n- \"Create a cluster?\" -> POST /ai/clusters\n- \"Delete a cluster?\" -> DELETE /ai/clusters/{task_id}\n- \"Get cluster details?\" -> GET /ai/clusters/{task_id}\n- \"List all graph?\" -> GET /ai/clusters/{task_id}/graph\n- \"List all collections?\" -> GET /ai/collections\n- \"Create a collection?\" -> POST /ai/collections\n- \"Get slug details?\" -> GET /ai/collections/slug/{slug}\n- \"Delete a collection?\" -> DELETE /ai/collections/{uuid}\n- \"Get collection details?\" -> GET /ai/collections/{uuid}\n- \"Partially update a collection?\" -> PATCH /ai/collections/{uuid}\n- \"List all settings?\" -> GET /ai/collections/{uuid}/settings\n- \"List all sources?\" -> GET /ai/collections/{uuid}/sources\n- \"Create a source?\" -> POST /ai/collections/{uuid}/sources\n- \"Delete a source?\" -> DELETE /ai/collections/{uuid}/sources/{sourceId}\n- \"Search conversation_histories?\" -> GET /ai/conversation_histories\n- \"List all conversations?\" -> GET /ai/conversations\n- \"Create a conversation?\" -> POST /ai/conversations\n- \"List all aggregates?\" -> GET /ai/conversations/conversation-insights/aggregates\n- \"List all insight-groups?\" -> GET /ai/conversations/insight-groups\n- \"Create a insight-group?\" -> POST /ai/conversations/insight-groups\n- \"Delete a insight-group?\" -> DELETE /ai/conversations/insight-groups/{group_id}\n- \"Get insight-group details?\" -> GET /ai/conversations/insight-groups/{group_id}\n- \"Update a insight-group?\" -> PUT /ai/conversations/insight-groups/{group_id}\n- \"Create a assign?\" -> POST /ai/conversations/insight-groups/{group_id}/insights/{insight_id}/assign\n- \"List all insights?\" -> GET /ai/conversations/insights\n- \"Create a insight?\" -> POST /ai/conversations/insights\n- \"Delete a insight?\" -> DELETE /ai/conversations/insights/{insight_id}\n- \"Get insight details?\" -> GET /ai/conversations/insights/{insight_id}\n- \"Update a insight?\" -> PUT /ai/conversations/insights/{insight_id}\n- \"Delete a conversation?\" -> DELETE /ai/conversations/{conversation_id}\n- \"Get conversation details?\" -> GET /ai/conversations/{conversation_id}\n- \"Update a conversation?\" -> PUT /ai/conversations/{conversation_id}\n- \"List all conversations-insights?\" -> GET /ai/conversations/{conversation_id}/conversations-insights\n- \"List all messages?\" -> GET /ai/conversations/{conversation_id}/messages\n- \"List all embeddings?\" -> GET /ai/embeddings\n- \"Create a embedding?\" -> POST /ai/embeddings\n- \"List all buckets?\" -> GET /ai/embeddings/buckets\n- \"Delete a bucket?\" -> DELETE /ai/embeddings/buckets/{bucket_name}\n- \"Get bucket details?\" -> GET /ai/embeddings/buckets/{bucket_name}\n- \"Create a similarity-search?\" -> POST /ai/embeddings/similarity-search\n- \"Create a url?\" -> POST /ai/embeddings/url\n- \"Get embedding details?\" -> GET /ai/embeddings/{task_id}\n- \"List all jobs?\" -> GET /ai/fine_tuning/jobs\n- \"Create a job?\" -> POST /ai/fine_tuning/jobs\n- \"Get job details?\" -> GET /ai/fine_tuning/jobs/{job_id}\n- \"Create a cancel?\" -> POST /ai/fine_tuning/jobs/{job_id}/cancel\n- \"List all integrations?\" -> GET /ai/integrations\n- \"List all connections?\" -> GET /ai/integrations/connections\n- \"Delete a connection?\" -> DELETE /ai/integrations/connections/{user_connection_id}\n- \"Get connection details?\" -> GET /ai/integrations/connections/{user_connection_id}\n- \"Get integration details?\" -> GET /ai/integrations/{integration_id}\n- \"Search documents?\" -> GET /ai/knowledge/collections/{slug}/documents\n- \"List all mcp_servers?\" -> GET /ai/mcp_servers\n- \"Create a mcp_server?\" -> POST /ai/mcp_servers\n- \"Delete a mcp_server?\" -> DELETE /ai/mcp_servers/{mcp_server_id}\n- \"Get mcp_server details?\" -> GET /ai/mcp_servers/{mcp_server_id}\n- \"Update a mcp_server?\" -> PUT /ai/mcp_servers/{mcp_server_id}\n- \"List all namespaces?\" -> GET /ai/memory/namespaces\n- \"Create a namespace?\" -> POST /ai/memory/namespaces\n- \"Delete a namespace?\" -> DELETE /ai/memory/namespaces/{namespace}\n- \"Get operation details?\" -> GET /ai/memory/namespaces/{namespace}/operations/{operation_id}\n- \"List all profiles?\" -> GET /ai/memory/namespaces/{namespace}/profiles\n- \"Delete a profile?\" -> DELETE /ai/memory/namespaces/{namespace}/profiles/{profile_id}\n- \"Create a ingest?\" -> POST /ai/memory/namespaces/{namespace}/profiles/{profile_id}/ingest\n- \"List all memories?\" -> GET /ai/memory/namespaces/{namespace}/profiles/{profile_id}/memories\n- \"Get memory details?\" -> GET /ai/memory/namespaces/{namespace}/profiles/{profile_id}/memories/{memory_id}\n- \"Create a recall?\" -> POST /ai/memory/namespaces/{namespace}/profiles/{profile_id}/recall\n- \"Create a remember?\" -> POST /ai/memory/namespaces/{namespace}/profiles/{profile_id}/remember\n- \"Get source details?\" -> GET /ai/memory/namespaces/{namespace}/profiles/{profile_id}/sources/{source_id}\n- \"List all summary?\" -> GET /ai/memory/namespaces/{namespace}/profiles/{profile_id}/summary\n- \"List all missions?\" -> GET /ai/missions\n- \"Create a mission?\" -> POST /ai/missions\n- \"List all events?\" -> GET /ai/missions/events\n- \"Delete a mission?\" -> DELETE /ai/missions/{mission_id}\n- \"Get mission details?\" -> GET /ai/missions/{mission_id}\n- \"Update a mission?\" -> PUT /ai/missions/{mission_id}\n- \"List all knowledge-bases?\" -> GET /ai/missions/{mission_id}/knowledge-bases\n- \"Create a knowledge-base?\" -> POST /ai/missions/{mission_id}/knowledge-bases\n- \"Delete a knowledge-base?\" -> DELETE /ai/missions/{mission_id}/knowledge-bases/{knowledge_base_id}\n- \"Get knowledge-base details?\" -> GET /ai/missions/{mission_id}/knowledge-bases/{knowledge_base_id}\n- \"Update a knowledge-base?\" -> PUT /ai/missions/{mission_id}/knowledge-bases/{knowledge_base_id}\n- \"List all mcp-servers?\" -> GET /ai/missions/{mission_id}/mcp-servers\n- \"Create a mcp-server?\" -> POST /ai/missions/{mission_id}/mcp-servers\n- \"Delete a mcp-server?\" -> DELETE /ai/missions/{mission_id}/mcp-servers/{mcp_server_id}\n- \"Get mcp-server details?\" -> GET /ai/missions/{mission_id}/mcp-servers/{mcp_server_id}\n- \"Update a mcp-server?\" -> PUT /ai/missions/{mission_id}/mcp-servers/{mcp_server_id}\n- \"Partially update a run?\" -> PATCH /ai/missions/{mission_id}/runs/{run_id}\n- \"Create a event?\" -> POST /ai/missions/{mission_id}/runs/{run_id}/events\n- \"Get event details?\" -> GET /ai/missions/{mission_id}/runs/{run_id}/events/{event_id}\n- \"Create a pause?\" -> POST /ai/missions/{mission_id}/runs/{run_id}/pause\n- \"List all plan?\" -> GET /ai/missions/{mission_id}/runs/{run_id}/plan\n- \"Create a plan?\" -> POST /ai/missions/{mission_id}/runs/{run_id}/plan\n- \"Create a step?\" -> POST /ai/missions/{mission_id}/runs/{run_id}/plan/steps\n- \"Get step details?\" -> GET /ai/missions/{mission_id}/runs/{run_id}/plan/steps/{step_id}\n- \"Partially update a step?\" -> PATCH /ai/missions/{mission_id}/runs/{run_id}/plan/steps/{step_id}\n- \"Create a resume?\" -> POST /ai/missions/{mission_id}/runs/{run_id}/resume\n- \"List all telnyx-agents?\" -> GET /ai/missions/{mission_id}/runs/{run_id}/telnyx-agents\n- \"Create a telnyx-agent?\" -> POST /ai/missions/{mission_id}/runs/{run_id}/telnyx-agents\n- \"Delete a telnyx-agent?\" -> DELETE /ai/missions/{mission_id}/runs/{run_id}/telnyx-agents/{telnyx_agent_id}\n- \"List all tools?\" -> GET /ai/missions/{mission_id}/tools\n- \"Create a tool?\" -> POST /ai/missions/{mission_id}/tools\n- \"Get tool details?\" -> GET /ai/missions/{mission_id}/tools/{tool_id}\n- \"List all models?\" -> GET /ai/models\n- \"Create a response?\" -> POST /ai/openai/responses\n- \"Create a summarize?\" -> POST /ai/summarize\n- \"Partially update a tool?\" -> PATCH /ai/tools/{tool_id}\n- \"Create a systemone?\" -> POST /ai/typesafe/v1/systemone\n- \"List all alphanumeric_sender_ids?\" -> GET /alphanumeric_sender_ids\n- \"Create a alphanumeric_sender_id?\" -> POST /alphanumeric_sender_ids\n- \"Delete a alphanumeric_sender_id?\" -> DELETE /alphanumeric_sender_ids/{id}\n- \"Get alphanumeric_sender_id details?\" -> GET /alphanumeric_sender_ids/{id}\n- \"List all audit_events?\" -> GET /audit_events\n- \"List all authentication_providers?\" -> GET /authentication_providers\n- \"Create a authentication_provider?\" -> POST /authentication_providers\n- \"Delete a authentication_provider?\" -> DELETE /authentication_providers/{id}\n- \"Get authentication_provider details?\" -> GET /authentication_providers/{id}\n- \"Partially update a authentication_provider?\" -> PATCH /authentication_providers/{id}\n- \"List all available_phone_number_blocks?\" -> GET /available_phone_number_blocks\n- \"List all available_phone_numbers?\" -> GET /available_phone_numbers\n- \"List all balance?\" -> GET /balance\n- \"List all billing_groups?\" -> GET /billing_groups\n- \"Create a billing_group?\" -> POST /billing_groups\n- \"Delete a billing_group?\" -> DELETE /billing_groups/{id}\n- \"Get billing_group details?\" -> GET /billing_groups/{id}\n- \"Partially update a billing_group?\" -> PATCH /billing_groups/{id}\n- \"List all bulk_sim_card_actions?\" -> GET /bulk_sim_card_actions\n- \"Get bulk_sim_card_action details?\" -> GET /bulk_sim_card_actions/{id}\n- \"List all billing_bundles?\" -> GET /bundle_pricing/billing_bundles\n- \"Get billing_bundle details?\" -> GET /bundle_pricing/billing_bundles/{bundle_id}\n- \"List all user_bundles?\" -> GET /bundle_pricing/user_bundles\n- \"Create a bulk?\" -> POST /bundle_pricing/user_bundles/bulk\n- \"List all unused?\" -> GET /bundle_pricing/user_bundles/unused\n- \"Delete a user_bundle?\" -> DELETE /bundle_pricing/user_bundles/{user_bundle_id}\n- \"Get user_bundle details?\" -> GET /bundle_pricing/user_bundles/{user_bundle_id}\n- \"List all resources?\" -> GET /bundle_pricing/user_bundles/{user_bundle_id}/resources\n- \"List all call_control_applications?\" -> GET /call_control_applications\n- \"Create a call_control_application?\" -> POST /call_control_applications\n- \"Delete a call_control_application?\" -> DELETE /call_control_applications/{id}\n- \"Get call_control_application details?\" -> GET /call_control_applications/{id}\n- \"Partially update a call_control_application?\" -> PATCH /call_control_applications/{id}\n- \"List all call_events?\" -> GET /call_events\n- \"List all call_reasons?\" -> GET /call_reasons\n- \"Create a call?\" -> POST /calls\n- \"Get call details?\" -> GET /calls/{call_control_id}\n- \"Create a ai_assistant_add_message?\" -> POST /calls/{call_control_id}/actions/ai_assistant_add_messages\n- \"Create a ai_assistant_join?\" -> POST /calls/{call_control_id}/actions/ai_assistant_join\n- \"Create a ai_assistant_start?\" -> POST /calls/{call_control_id}/actions/ai_assistant_start\n- \"Create a ai_assistant_stop?\" -> POST /calls/{call_control_id}/actions/ai_assistant_stop\n- \"Create a answer?\" -> POST /calls/{call_control_id}/actions/answer\n- \"Create a bridge?\" -> POST /calls/{call_control_id}/actions/bridge\n- \"Create a conversation_relay_start?\" -> POST /calls/{call_control_id}/actions/conversation_relay_start\n- \"Create a conversation_relay_stop?\" -> POST /calls/{call_control_id}/actions/conversation_relay_stop\n- \"Create a enqueue?\" -> POST /calls/{call_control_id}/actions/enqueue\n- \"Create a fork_start?\" -> POST /calls/{call_control_id}/actions/fork_start\n- \"Create a fork_stop?\" -> POST /calls/{call_control_id}/actions/fork_stop\n- \"Create a gather?\" -> POST /calls/{call_control_id}/actions/gather\n- \"Create a gather_stop?\" -> POST /calls/{call_control_id}/actions/gather_stop\n- \"Create a gather_using_ai?\" -> POST /calls/{call_control_id}/actions/gather_using_ai\n- \"Create a gather_using_audio?\" -> POST /calls/{call_control_id}/actions/gather_using_audio\n- \"Create a gather_using_speak?\" -> POST /calls/{call_control_id}/actions/gather_using_speak\n- \"Create a hangup?\" -> POST /calls/{call_control_id}/actions/hangup\n- \"Create a leave_queue?\" -> POST /calls/{call_control_id}/actions/leave_queue\n- \"Create a pay?\" -> POST /calls/{call_control_id}/actions/pay\n- \"Create a playback_start?\" -> POST /calls/{call_control_id}/actions/playback_start\n- \"Create a playback_stop?\" -> POST /calls/{call_control_id}/actions/playback_stop\n- \"Create a record_pause?\" -> POST /calls/{call_control_id}/actions/record_pause\n- \"Create a record_resume?\" -> POST /calls/{call_control_id}/actions/record_resume\n- \"Create a record_start?\" -> POST /calls/{call_control_id}/actions/record_start\n- \"Create a record_stop?\" -> POST /calls/{call_control_id}/actions/record_stop\n- \"Create a refer?\" -> POST /calls/{call_control_id}/actions/refer\n- \"Create a reject?\" -> POST /calls/{call_control_id}/actions/reject\n- \"Create a send_dtmf?\" -> POST /calls/{call_control_id}/actions/send_dtmf\n- \"Create a send_sip_info?\" -> POST /calls/{call_control_id}/actions/send_sip_info\n- \"Create a siprec_start?\" -> POST /calls/{call_control_id}/actions/siprec_start\n- \"Create a siprec_stop?\" -> POST /calls/{call_control_id}/actions/siprec_stop\n- \"Create a speak?\" -> POST /calls/{call_control_id}/actions/speak\n- \"Create a streaming_start?\" -> POST /calls/{call_control_id}/actions/streaming_start\n- \"Create a streaming_stop?\" -> POST /calls/{call_control_id}/actions/streaming_stop\n- \"Create a suppression_start?\" -> POST /calls/{call_control_id}/actions/suppression_start\n- \"Create a suppression_stop?\" -> POST /calls/{call_control_id}/actions/suppression_stop\n- \"Create a switch_supervisor_role?\" -> POST /calls/{call_control_id}/actions/switch_supervisor_role\n- \"Create a transcription_start?\" -> POST /calls/{call_control_id}/actions/transcription_start\n- \"Create a transcription_stop?\" -> POST /calls/{call_control_id}/actions/transcription_stop\n- \"Create a transfer?\" -> POST /calls/{call_control_id}/actions/transfer\n- \"List all channel_zones?\" -> GET /channel_zones\n- \"Update a channel_zone?\" -> PUT /channel_zones/{channel_zone_id}\n- \"List all charges_breakdown?\" -> GET /charges_breakdown\n- \"List all charges_summary?\" -> GET /charges_summary\n- \"List all comments?\" -> GET /comments\n- \"Create a comment?\" -> POST /comments\n- \"Get comment details?\" -> GET /comments/{id}\n- \"List all logs?\" -> GET /compute/funcs/{id}/logs\n- \"List all export?\" -> GET /compute/funcs/{id}/logs/export\n- \"List all metric_aggregates?\" -> GET /compute/funcs/{id}/metric_aggregates\n- \"List all revisions?\" -> GET /compute/funcs/{id}/revisions\n- \"List all ship_inspection?\" -> GET /compute/funcs/{id}/ship_inspection\n- \"List all conferences?\" -> GET /conferences\n- \"Create a conference?\" -> POST /conferences\n- \"List all participants?\" -> GET /conferences/{conference_id}/participants\n- \"Get conference details?\" -> GET /conferences/{id}\n- \"Create a end?\" -> POST /conferences/{id}/actions/end\n- \"Create a hold?\" -> POST /conferences/{id}/actions/hold\n- \"Create a join?\" -> POST /conferences/{id}/actions/join\n- \"Create a leave?\" -> POST /conferences/{id}/actions/leave\n- \"Create a mute?\" -> POST /conferences/{id}/actions/mute\n- \"Create a play?\" -> POST /conferences/{id}/actions/play\n- \"Create a stop?\" -> POST /conferences/{id}/actions/stop\n- \"Create a unhold?\" -> POST /conferences/{id}/actions/unhold\n- \"Create a unmute?\" -> POST /conferences/{id}/actions/unmute\n- \"Create a update?\" -> POST /conferences/{id}/actions/update\n- \"Get participant details?\" -> GET /conferences/{id}/participants/{participant_id}\n- \"Partially update a participant?\" -> PATCH /conferences/{id}/participants/{participant_id}\n- \"List all count?\" -> GET /connections/count\n- \"List all active_calls?\" -> GET /connections/{connection_id}/active_calls\n- \"List all country_coverage?\" -> GET /country_coverage\n- \"Get country details?\" -> GET /country_coverage/countries/{country_code}\n- \"List all credential_connections?\" -> GET /credential_connections\n- \"Create a credential_connection?\" -> POST /credential_connections\n- \"Delete a credential_connection?\" -> DELETE /credential_connections/{id}\n- \"Get credential_connection details?\" -> GET /credential_connections/{id}\n- \"Partially update a credential_connection?\" -> PATCH /credential_connections/{id}\n- \"Create a check_registration_status?\" -> POST /credential_connections/{id}/actions/check_registration_status\n- \"Delete a custom_storage_credential?\" -> DELETE /custom_storage_credentials/{connection_id}\n- \"Get custom_storage_credential details?\" -> GET /custom_storage_credentials/{connection_id}\n- \"Update a custom_storage_credential?\" -> PUT /custom_storage_credentials/{connection_id}\n- \"List all customer_service_records?\" -> GET /customer_service_records\n- \"Create a customer_service_record?\" -> POST /customer_service_records\n- \"Create a phone_number_coverage?\" -> POST /customer_service_records/phone_number_coverages\n- \"Get customer_service_record details?\" -> GET /customer_service_records/{customer_service_record_id}\n- \"List all detail_records?\" -> GET /detail_records\n- \"Delete a dialogflow_connection?\" -> DELETE /dialogflow_connections/{connection_id}\n- \"Get dialogflow_connection details?\" -> GET /dialogflow_connections/{connection_id}\n- \"Update a dialogflow_connection?\" -> PUT /dialogflow_connections/{connection_id}\n- \"List all dir?\" -> GET /dir\n- \"List all document_types?\" -> GET /dir/document_types\n- \"Delete a dir?\" -> DELETE /dir/{dir_id}\n- \"Get dir details?\" -> GET /dir/{dir_id}\n- \"Partially update a dir?\" -> PATCH /dir/{dir_id}\n- \"List all bpo_authorizations?\" -> GET /dir/{dir_id}/bpo_authorizations\n- \"Create a bpo_loa?\" -> POST /dir/{dir_id}/bpo_loa\n- \"List all infringement_claims?\" -> GET /dir/{dir_id}/infringement_claims\n- \"Create a loa?\" -> POST /dir/{dir_id}/loa\n- \"List all phone_number_batches?\" -> GET /dir/{dir_id}/phone_number_batches\n- \"Get phone_number_batche details?\" -> GET /dir/{dir_id}/phone_number_batches/{batch_id}\n- \"List all phone_numbers?\" -> GET /dir/{dir_id}/phone_numbers\n- \"Create a phone_number?\" -> POST /dir/{dir_id}/phone_numbers\n- \"List all references?\" -> GET /dir/{dir_id}/references\n- \"Create a reference?\" -> POST /dir/{dir_id}/references\n- \"Partially update a reference?\" -> PATCH /dir/{dir_id}/references/{ref_type}/{slot}\n- \"Create a submit?\" -> POST /dir/{dir_id}/submit\n- \"List all verify_email?\" -> GET /dir/{dir_id}/verify_email\n- \"Create a verify_email?\" -> POST /dir/{dir_id}/verify_email\n- \"Create a confirm?\" -> POST /dir/{dir_id}/verify_email/confirm\n- \"List all document_links?\" -> GET /document_links\n- \"List all documents?\" -> GET /documents\n- \"Create a document?\" -> POST /documents\n- \"Delete a document?\" -> DELETE /documents/{id}\n- \"Get document details?\" -> GET /documents/{id}\n- \"Partially update a document?\" -> PATCH /documents/{id}\n- \"List all download?\" -> GET /documents/{id}/download\n- \"List all download_link?\" -> GET /documents/{id}/download_link\n- \"List all dynamic_emergency_addresses?\" -> GET /dynamic_emergency_addresses\n- \"Create a dynamic_emergency_addresse?\" -> POST /dynamic_emergency_addresses\n- \"Delete a dynamic_emergency_addresse?\" -> DELETE /dynamic_emergency_addresses/{id}\n- \"Get dynamic_emergency_addresse details?\" -> GET /dynamic_emergency_addresses/{id}\n- \"List all dynamic_emergency_endpoints?\" -> GET /dynamic_emergency_endpoints\n- \"Create a dynamic_emergency_endpoint?\" -> POST /dynamic_emergency_endpoints\n- \"Delete a dynamic_emergency_endpoint?\" -> DELETE /dynamic_emergency_endpoints/{id}\n- \"Get dynamic_emergency_endpoint details?\" -> GET /dynamic_emergency_endpoints/{id}\n- \"List all email_blocks?\" -> GET /email_blocks\n- \"Create a email_block?\" -> POST /email_blocks\n- \"Get import details?\" -> GET /email_blocks/import/{id}\n- \"Delete a email_block?\" -> DELETE /email_blocks/{id}\n- \"Get email_block details?\" -> GET /email_blocks/{id}\n- \"List all email_domains?\" -> GET /email_domains\n- \"Create a email_domain?\" -> POST /email_domains\n- \"List all dns_records?\" -> GET /email_domains/{domain_id}/dns_records\n- \"Create a rotate_dkim?\" -> POST /email_domains/{domain_id}/rotate_dkim\n- \"Create a verify?\" -> POST /email_domains/{domain_id}/verify\n- \"List all webhooks?\" -> GET /email_domains/{domain_id}/webhooks\n- \"Create a webhook?\" -> POST /email_domains/{domain_id}/webhooks\n- \"Delete a webhook?\" -> DELETE /email_domains/{domain_id}/webhooks/{id}\n- \"Get webhook details?\" -> GET /email_domains/{domain_id}/webhooks/{id}\n- \"Partially update a webhook?\" -> PATCH /email_domains/{domain_id}/webhooks/{id}\n- \"Delete a email_domain?\" -> DELETE /email_domains/{id}\n- \"Get email_domain details?\" -> GET /email_domains/{id}\n- \"Partially update a email_domain?\" -> PATCH /email_domains/{id}\n- \"List all health?\" -> GET /email_domains/{id}/health\n- \"List all email_events?\" -> GET /email_events\n- \"List all stats?\" -> GET /email_events/stats\n- \"List all email_inboxes?\" -> GET /email_inboxes\n- \"Create a email_inboxe?\" -> POST /email_inboxes\n- \"Delete a email_inboxe?\" -> DELETE /email_inboxes/{id}\n- \"Get email_inboxe details?\" -> GET /email_inboxes/{id}\n- \"List all drafts?\" -> GET /email_inboxes/{inbox_id}/drafts\n- \"Create a draft?\" -> POST /email_inboxes/{inbox_id}/drafts\n- \"Delete a draft?\" -> DELETE /email_inboxes/{inbox_id}/drafts/{draft_id}\n- \"Get draft details?\" -> GET /email_inboxes/{inbox_id}/drafts/{draft_id}\n- \"Partially update a draft?\" -> PATCH /email_inboxes/{inbox_id}/drafts/{draft_id}\n- \"Update a draft?\" -> PUT /email_inboxes/{inbox_id}/drafts/{draft_id}\n- \"Create a send?\" -> POST /email_inboxes/{inbox_id}/drafts/{draft_id}/send\n- \"List all filters?\" -> GET /email_inboxes/{inbox_id}/filters\n- \"Create a filter?\" -> POST /email_inboxes/{inbox_id}/filters\n- \"Partially update a message?\" -> PATCH /email_inboxes/{inbox_id}/messages/{message_id}\n- \"Create a forward?\" -> POST /email_inboxes/{inbox_id}/messages/{message_id}/actions/forward\n- \"Create a reply?\" -> POST /email_inboxes/{inbox_id}/messages/{message_id}/actions/reply\n- \"Create a reply_all?\" -> POST /email_inboxes/{inbox_id}/messages/{message_id}/actions/reply_all\n- \"Create a label?\" -> POST /email_inboxes/{inbox_id}/messages/{message_id}/labels\n- \"List all threads?\" -> GET /email_inboxes/{inbox_id}/threads\n- \"Get thread details?\" -> GET /email_inboxes/{inbox_id}/threads/{thread_id}\n- \"List all email_messages?\" -> GET /email_messages\n- \"Create a email_message?\" -> POST /email_messages\n- \"Create a batch?\" -> POST /email_messages/batch\n- \"List all recipients?\" -> GET /email_messages/{email_id}/recipients\n- \"Get recipient details?\" -> GET /email_messages/{email_id}/recipients/{recipient_id}\n- \"Delete a email_message?\" -> DELETE /email_messages/{id}\n- \"Get email_message details?\" -> GET /email_messages/{id}\n- \"List all email_templates?\" -> GET /email_templates\n- \"Create a email_template?\" -> POST /email_templates\n- \"Delete a email_template?\" -> DELETE /email_templates/{id}\n- \"Get email_template details?\" -> GET /email_templates/{id}\n- \"Partially update a email_template?\" -> PATCH /email_templates/{id}\n- \"Update a email_template?\" -> PUT /email_templates/{id}\n- \"Create a render?\" -> POST /email_templates/{id}/render\n- \"List all email_threads?\" -> GET /email_threads\n- \"Get email_thread details?\" -> GET /email_threads/{thread_id}\n- \"List all email_unsubscribe_groups?\" -> GET /email_unsubscribe_groups\n- \"Create a email_unsubscribe_group?\" -> POST /email_unsubscribe_groups\n- \"Delete a email_unsubscribe_group?\" -> DELETE /email_unsubscribe_groups/{id}\n- \"Get email_unsubscribe_group details?\" -> GET /email_unsubscribe_groups/{id}\n- \"Partially update a email_unsubscribe_group?\" -> PATCH /email_unsubscribe_groups/{id}\n- \"List all suppressions?\" -> GET /email_unsubscribe_groups/{id}/suppressions\n- \"Create a suppression?\" -> POST /email_unsubscribe_groups/{id}/suppressions\n- \"Delete a suppression?\" -> DELETE /email_unsubscribe_groups/{id}/suppressions/{email}\n- \"Create a email_validation?\" -> POST /email_validations\n- \"Get batch details?\" -> GET /email_validations/batch/{id}\n- \"List all enterprises?\" -> GET /enterprises\n- \"Create a enterprise?\" -> POST /enterprises\n- \"Delete a enterprise?\" -> DELETE /enterprises/{enterprise_id}\n- \"Get enterprise details?\" -> GET /enterprises/{enterprise_id}\n- \"Update a enterprise?\" -> PUT /enterprises/{enterprise_id}\n- \"Create a branded_calling?\" -> POST /enterprises/{enterprise_id}/branded_calling\n- \"Create a dir?\" -> POST /enterprises/{enterprise_id}/dir\n- \"List all reputation?\" -> GET /enterprises/{enterprise_id}/reputation\n- \"Create a reputation?\" -> POST /enterprises/{enterprise_id}/reputation\n- \"List all numbers?\" -> GET /enterprises/{enterprise_id}/reputation/numbers\n- \"Create a number?\" -> POST /enterprises/{enterprise_id}/reputation/numbers\n- \"Create a refresh?\" -> POST /enterprises/{enterprise_id}/reputation/numbers/refresh\n- \"Delete a number?\" -> DELETE /enterprises/{enterprise_id}/reputation/numbers/{phone_number}\n- \"Get number details?\" -> GET /enterprises/{enterprise_id}/reputation/numbers/{phone_number}\n- \"List all remediation?\" -> GET /enterprises/{enterprise_id}/reputation/remediation\n- \"Create a remediation?\" -> POST /enterprises/{enterprise_id}/reputation/remediation\n- \"Get remediation details?\" -> GET /enterprises/{enterprise_id}/reputation/remediation/{remediation_id}\n- \"List all external_connections?\" -> GET /external_connections\n- \"Create a external_connection?\" -> POST /external_connections\n- \"List all log_messages?\" -> GET /external_connections/log_messages\n- \"Delete a log_message?\" -> DELETE /external_connections/log_messages/{id}\n- \"Get log_message details?\" -> GET /external_connections/log_messages/{id}\n- \"Delete a external_connection?\" -> DELETE /external_connections/{id}\n- \"Get external_connection details?\" -> GET /external_connections/{id}\n- \"Partially update a external_connection?\" -> PATCH /external_connections/{id}\n- \"List all civic_addresses?\" -> GET /external_connections/{id}/civic_addresses\n- \"Get civic_addresse details?\" -> GET /external_connections/{id}/civic_addresses/{address_id}\n- \"Partially update a location?\" -> PATCH /external_connections/{id}/locations/{location_id}\n- \"Get phone_number details?\" -> GET /external_connections/{id}/phone_numbers/{phone_number_id}\n- \"Partially update a phone_number?\" -> PATCH /external_connections/{id}/phone_numbers/{phone_number_id}\n- \"List all releases?\" -> GET /external_connections/{id}/releases\n- \"Get release details?\" -> GET /external_connections/{id}/releases/{release_id}\n- \"List all uploads?\" -> GET /external_connections/{id}/uploads\n- \"Create a upload?\" -> POST /external_connections/{id}/uploads\n- \"List all status?\" -> GET /external_connections/{id}/uploads/status\n- \"Get upload details?\" -> GET /external_connections/{id}/uploads/{ticket_id}\n- \"Create a retry?\" -> POST /external_connections/{id}/uploads/{ticket_id}/retry\n- \"Get sub_number_order details?\" -> GET /external_requirements/{regulatory_requirement_id}/sub_number_orders/{sub_number_order_id}\n- \"List all fax_applications?\" -> GET /fax_applications\n- \"Create a fax_application?\" -> POST /fax_applications\n- \"Delete a fax_application?\" -> DELETE /fax_applications/{id}\n- \"Get fax_application details?\" -> GET /fax_applications/{id}\n- \"Partially update a fax_application?\" -> PATCH /fax_applications/{id}\n- \"List all faxes?\" -> GET /faxes\n- \"Create a faxe?\" -> POST /faxes\n- \"Delete a faxe?\" -> DELETE /faxes/{id}\n- \"Get faxe details?\" -> GET /faxes/{id}\n- \"List all fqdn_connections?\" -> GET /fqdn_connections\n- \"Create a fqdn_connection?\" -> POST /fqdn_connections\n- \"List all fqdn_authentication?\" -> GET /fqdn_connections/{fqdn_connection_id}/fqdn_authentication\n- \"Delete a fqdn_connection?\" -> DELETE /fqdn_connections/{id}\n- \"Get fqdn_connection details?\" -> GET /fqdn_connections/{id}\n- \"Partially update a fqdn_connection?\" -> PATCH /fqdn_connections/{id}\n- \"List all fqdns?\" -> GET /fqdns\n- \"Create a fqdn?\" -> POST /fqdns\n- \"Delete a fqdn?\" -> DELETE /fqdns/{id}\n- \"Get fqdn details?\" -> GET /fqdns/{id}\n- \"Partially update a fqdn?\" -> PATCH /fqdns/{id}\n- \"List all global_ip_allowed_ports?\" -> GET /global_ip_allowed_ports\n- \"List all global_ip_assignment_health?\" -> GET /global_ip_assignment_health\n- \"List all global_ip_assignments?\" -> GET /global_ip_assignments\n- \"Create a global_ip_assignment?\" -> POST /global_ip_assignments\n- \"List all usage?\" -> GET /global_ip_assignments/usage\n- \"Delete a global_ip_assignment?\" -> DELETE /global_ip_assignments/{id}\n- \"Get global_ip_assignment details?\" -> GET /global_ip_assignments/{id}\n- \"Partially update a global_ip_assignment?\" -> PATCH /global_ip_assignments/{id}\n- \"List all global_ip_assignments_usage?\" -> GET /global_ip_assignments_usage\n- \"List all global_ip_health_check_types?\" -> GET /global_ip_health_check_types\n- \"List all global_ip_health_checks?\" -> GET /global_ip_health_checks\n- \"Create a global_ip_health_check?\" -> POST /global_ip_health_checks\n- \"Delete a global_ip_health_check?\" -> DELETE /global_ip_health_checks/{id}\n- \"Get global_ip_health_check details?\" -> GET /global_ip_health_checks/{id}\n- \"List all global_ip_latency?\" -> GET /global_ip_latency\n- \"List all global_ip_protocols?\" -> GET /global_ip_protocols\n- \"List all global_ip_usage?\" -> GET /global_ip_usage\n- \"List all global_ips?\" -> GET /global_ips\n- \"Create a global_ip?\" -> POST /global_ips\n- \"Delete a global_ip?\" -> DELETE /global_ips/{id}\n- \"Get global_ip details?\" -> GET /global_ips/{id}\n- \"List all inbound_channels?\" -> GET /inbound_channels\n- \"List all inexplicit_number_orders?\" -> GET /inexplicit_number_orders\n- \"Create a inexplicit_number_order?\" -> POST /inexplicit_number_orders\n- \"Get inexplicit_number_order details?\" -> GET /inexplicit_number_orders/{id}\n- \"Get infringement_claim details?\" -> GET /infringement_claims/{claim_id}\n- \"Create a contest?\" -> POST /infringement_claims/{claim_id}/contest\n- \"List all integration_secrets?\" -> GET /integration_secrets\n- \"Create a integration_secret?\" -> POST /integration_secrets\n- \"Delete a integration_secret?\" -> DELETE /integration_secrets/{id}\n- \"List all inventory_coverage?\" -> GET /inventory_coverage\n- \"List all invoices?\" -> GET /invoices\n- \"Get invoice details?\" -> GET /invoices/{id}\n- \"List all ip_connections?\" -> GET /ip_connections\n- \"Create a ip_connection?\" -> POST /ip_connections\n- \"Delete a ip_connection?\" -> DELETE /ip_connections/{id}\n- \"Get ip_connection details?\" -> GET /ip_connections/{id}\n- \"Partially update a ip_connection?\" -> PATCH /ip_connections/{id}\n- \"List all ips?\" -> GET /ips\n- \"Create a ip?\" -> POST /ips\n- \"Delete a ip?\" -> DELETE /ips/{id}\n- \"Get ip details?\" -> GET /ips/{id}\n- \"Partially update a ip?\" -> PATCH /ips/{id}\n- \"Create a ledger_billing_group_report?\" -> POST /ledger_billing_group_reports\n- \"Get ledger_billing_group_report details?\" -> GET /ledger_billing_group_reports/{id}\n- \"List all text?\" -> GET /legacy/reporting/batch/detail/records/speech/to/text\n- \"Create a text?\" -> POST /legacy/reporting/batch/detail/records/speech/to/text\n- \"Delete a text?\" -> DELETE /legacy/reporting/batch/detail/records/speech/to/text/{id}\n- \"Get text details?\" -> GET /legacy/reporting/batch/detail/records/speech/to/text/{id}\n- \"List all messaging?\" -> GET /legacy/reporting/batch_detail_records/messaging\n- \"Create a messaging?\" -> POST /legacy/reporting/batch_detail_records/messaging\n- \"Delete a messaging?\" -> DELETE /legacy/reporting/batch_detail_records/messaging/{id}\n- \"Get messaging details?\" -> GET /legacy/reporting/batch_detail_records/messaging/{id}\n- \"List all speech_to_text?\" -> GET /legacy/reporting/batch_detail_records/speech_to_text\n- \"Create a speech_to_text?\" -> POST /legacy/reporting/batch_detail_records/speech_to_text\n- \"Delete a speech_to_text?\" -> DELETE /legacy/reporting/batch_detail_records/speech_to_text/{id}\n- \"Get speech_to_text details?\" -> GET /legacy/reporting/batch_detail_records/speech_to_text/{id}\n- \"List all voice?\" -> GET /legacy/reporting/batch_detail_records/voice\n- \"Create a voice?\" -> POST /legacy/reporting/batch_detail_records/voice\n- \"List all fields?\" -> GET /legacy/reporting/batch_detail_records/voice/fields\n- \"Delete a voice?\" -> DELETE /legacy/reporting/batch_detail_records/voice/{id}\n- \"Get voice details?\" -> GET /legacy/reporting/batch_detail_records/voice/{id}\n- \"List all number_lookup?\" -> GET /legacy/reporting/usage_reports/number_lookup\n- \"Create a number_lookup?\" -> POST /legacy/reporting/usage_reports/number_lookup\n- \"Delete a number_lookup?\" -> DELETE /legacy/reporting/usage_reports/number_lookup/{id}\n- \"Get number_lookup details?\" -> GET /legacy/reporting/usage_reports/number_lookup/{id}\n- \"List all list?\" -> GET /list\n- \"Get list details?\" -> GET /list/{channel_zone_id}\n- \"Create a account-credit?\" -> POST /machine-payments/account-credit\n- \"List all managed_accounts?\" -> GET /managed_accounts\n- \"Create a managed_account?\" -> POST /managed_accounts\n- \"List all allocatable_global_outbound_channels?\" -> GET /managed_accounts/allocatable_global_outbound_channels\n- \"Get managed_account details?\" -> GET /managed_accounts/{id}\n- \"Partially update a managed_account?\" -> PATCH /managed_accounts/{id}\n- \"Create a disable?\" -> POST /managed_accounts/{id}/actions/disable\n- \"Create a enable?\" -> POST /managed_accounts/{id}/actions/enable\n- \"List all media?\" -> GET /media\n- \"Create a media?\" -> POST /media\n- \"Delete a media?\" -> DELETE /media/{media_name}\n- \"Get media details?\" -> GET /media/{media_name}\n- \"Update a media?\" -> PUT /media/{media_name}\n- \"List all meeting_sessions?\" -> GET /meeting_sessions\n- \"Create a meeting_session?\" -> POST /meeting_sessions\n- \"Delete a meeting_session?\" -> DELETE /meeting_sessions/{id}\n- \"Get meeting_session details?\" -> GET /meeting_sessions/{id}\n- \"Partially update a meeting_session?\" -> PATCH /meeting_sessions/{id}\n- \"Create a send_chat?\" -> POST /meeting_sessions/{id}/actions/send_chat\n- \"Create a stop_speaking?\" -> POST /meeting_sessions/{id}/actions/stop_speaking\n- \"List all artifacts?\" -> GET /meeting_sessions/{id}/artifacts\n- \"Create a artifact?\" -> POST /meeting_sessions/{id}/artifacts\n- \"Get artifact details?\" -> GET /meeting_sessions/{id}/artifacts/{artifact_id}\n- \"List all recordings?\" -> GET /meeting_sessions/{id}/recordings\n- \"List all transcript?\" -> GET /meeting_sessions/{id}/transcript\n- \"Create a id?\" -> POST /messages/alphanumeric/sender/id\n- \"Get group details?\" -> GET /messages/group/{message_id}\n- \"Create a group_mm?\" -> POST /messages/group_mms\n- \"Create a long_code?\" -> POST /messages/long_code\n- \"Create a number_pool?\" -> POST /messages/number_pool\n- \"Create a rc?\" -> POST /messages/rcs\n- \"Get deeplink details?\" -> GET /messages/rcs/deeplinks/{agent_id}\n- \"Get rcs_deeplink details?\" -> GET /messages/rcs_deeplinks/{agent_id}\n- \"Create a schedule?\" -> POST /messages/schedule\n- \"Create a short_code?\" -> POST /messages/short_code\n- \"Create a whatsapp?\" -> POST /messages/whatsapp\n- \"Delete a message?\" -> DELETE /messages/{id}\n- \"Get message details?\" -> GET /messages/{id}\n- \"Create a secret?\" -> POST /messaging/profiles/{id}/actions/regenerate/secret\n- \"List all ids?\" -> GET /messaging/profiles/{id}/alphanumeric/sender/ids\n- \"List all metrics?\" -> GET /messaging/profiles/{id}/metrics\n- \"List all agents?\" -> GET /messaging/rcs/agents\n- \"Get agent details?\" -> GET /messaging/rcs/agents/{id}\n- \"Partially update a agent?\" -> PATCH /messaging/rcs/agents/{id}\n- \"Create a bulk_capability?\" -> POST /messaging/rcs/bulk_capabilities\n- \"Get capability details?\" -> GET /messaging/rcs/capabilities/{agent_id}/{phone_number}\n- \"Update a test_number_invite?\" -> PUT /messaging/rcs/test_number_invite/{id}/{phone_number}\n- \"List all history?\" -> GET /messaging/tollfree/verification/requests/{id}/status/history\n- \"List all messaging_hosted_number_orders?\" -> GET /messaging_hosted_number_orders\n- \"Create a messaging_hosted_number_order?\" -> POST /messaging_hosted_number_orders\n- \"Create a eligibility_numbers_check?\" -> POST /messaging_hosted_number_orders/eligibility_numbers_check\n- \"Delete a messaging_hosted_number_order?\" -> DELETE /messaging_hosted_number_orders/{id}\n- \"Get messaging_hosted_number_order details?\" -> GET /messaging_hosted_number_orders/{id}\n- \"Create a file_upload?\" -> POST /messaging_hosted_number_orders/{id}/actions/file_upload\n- \"Create a validation_code?\" -> POST /messaging_hosted_number_orders/{id}/validation_codes\n- \"Create a verification_code?\" -> POST /messaging_hosted_number_orders/{id}/verification_codes\n- \"List all messaging_hosted_numbers?\" -> GET /messaging_hosted_numbers\n- \"Delete a messaging_hosted_number?\" -> DELETE /messaging_hosted_numbers/{id}\n- \"Get messaging_hosted_number details?\" -> GET /messaging_hosted_numbers/{id}\n- \"Partially update a messaging_hosted_number?\" -> PATCH /messaging_hosted_numbers/{id}\n- \"Create a bulk_update?\" -> POST /messaging_numbers/bulk_updates\n- \"Get bulk_update details?\" -> GET /messaging_numbers/bulk_updates/{order_id}\n- \"Create a messaging_numbers_bulk_update?\" -> POST /messaging_numbers_bulk_updates\n- \"Get messaging_numbers_bulk_update details?\" -> GET /messaging_numbers_bulk_updates/{order_id}\n- \"List all messaging_optouts?\" -> GET /messaging_optouts\n- \"List all messaging_profile_metrics?\" -> GET /messaging_profile_metrics\n- \"List all messaging_profiles?\" -> GET /messaging_profiles\n- \"Create a messaging_profile?\" -> POST /messaging_profiles\n- \"Delete a messaging_profile?\" -> DELETE /messaging_profiles/{id}\n- \"Get messaging_profile details?\" -> GET /messaging_profiles/{id}\n- \"Partially update a messaging_profile?\" -> PATCH /messaging_profiles/{id}\n- \"Create a regenerate_secret?\" -> POST /messaging_profiles/{id}/actions/regenerate_secret\n- \"List all short_codes?\" -> GET /messaging_profiles/{id}/short_codes\n- \"List all autoresp_configs?\" -> GET /messaging_profiles/{profile_id}/autoresp_configs\n- \"Create a autoresp_config?\" -> POST /messaging_profiles/{profile_id}/autoresp_configs\n- \"Delete a autoresp_config?\" -> DELETE /messaging_profiles/{profile_id}/autoresp_configs/{autoresp_cfg_id}\n- \"Get autoresp_config details?\" -> GET /messaging_profiles/{profile_id}/autoresp_configs/{autoresp_cfg_id}\n- \"Update a autoresp_config?\" -> PUT /messaging_profiles/{profile_id}/autoresp_configs/{autoresp_cfg_id}\n- \"List all requests?\" -> GET /messaging_tollfree/verification/requests\n- \"Create a request?\" -> POST /messaging_tollfree/verification/requests\n- \"Delete a request?\" -> DELETE /messaging_tollfree/verification/requests/{id}\n- \"Get request details?\" -> GET /messaging_tollfree/verification/requests/{id}\n- \"Partially update a request?\" -> PATCH /messaging_tollfree/verification/requests/{id}\n- \"List all status_history?\" -> GET /messaging_tollfree/verification/requests/{id}/status_history\n- \"List all messaging_url_domains?\" -> GET /messaging_url_domains\n- \"List all mobile_network_operators?\" -> GET /mobile_network_operators\n- \"List all mobile_push_credentials?\" -> GET /mobile_push_credentials\n- \"Create a mobile_push_credential?\" -> POST /mobile_push_credentials\n- \"Delete a mobile_push_credential?\" -> DELETE /mobile_push_credentials/{push_credential_id}\n- \"Get mobile_push_credential details?\" -> GET /mobile_push_credentials/{push_credential_id}\n- \"List all network_coverage?\" -> GET /network_coverage\n- \"List all networks?\" -> GET /networks\n- \"Create a network?\" -> POST /networks\n- \"Delete a network?\" -> DELETE /networks/{id}\n- \"Get network details?\" -> GET /networks/{id}\n- \"Partially update a network?\" -> PATCH /networks/{id}\n- \"List all default_gateway?\" -> GET /networks/{id}/default_gateway\n- \"Create a default_gateway?\" -> POST /networks/{id}/default_gateway\n- \"List all network_interfaces?\" -> GET /networks/{id}/network_interfaces\n- \"List all noise_suppression_engines?\" -> GET /noise_suppression_engines\n- \"List all notification_channels?\" -> GET /notification_channels\n- \"Create a notification_channel?\" -> POST /notification_channels\n- \"Delete a notification_channel?\" -> DELETE /notification_channels/{id}\n- \"Get notification_channel details?\" -> GET /notification_channels/{id}\n- \"Partially update a notification_channel?\" -> PATCH /notification_channels/{id}\n- \"List all notification_event_conditions?\" -> GET /notification_event_conditions\n- \"List all notification_events?\" -> GET /notification_events\n- \"List all notification_profiles?\" -> GET /notification_profiles\n- \"Create a notification_profile?\" -> POST /notification_profiles\n- \"Delete a notification_profile?\" -> DELETE /notification_profiles/{id}\n- \"Get notification_profile details?\" -> GET /notification_profiles/{id}\n- \"Partially update a notification_profile?\" -> PATCH /notification_profiles/{id}\n- \"List all notification_settings?\" -> GET /notification_settings\n- \"Create a notification_setting?\" -> POST /notification_settings\n- \"Delete a notification_setting?\" -> DELETE /notification_settings/{id}\n- \"Get notification_setting details?\" -> GET /notification_settings/{id}\n- \"List all number_block_orders?\" -> GET /number_block_orders\n- \"Create a number_block_order?\" -> POST /number_block_orders\n- \"Get number_block_order details?\" -> GET /number_block_orders/{number_block_order_id}\n- \"List all number_order_phone_numbers?\" -> GET /number_order_phone_numbers\n- \"Create a requirement_group?\" -> POST /number_order_phone_numbers/{id}/requirement_group\n- \"Get number_order_phone_number details?\" -> GET /number_order_phone_numbers/{number_order_phone_number_id}\n- \"Partially update a number_order_phone_number?\" -> PATCH /number_order_phone_numbers/{number_order_phone_number_id}\n- \"List all number_orders?\" -> GET /number_orders\n- \"Create a number_order?\" -> POST /number_orders\n- \"Get number_order details?\" -> GET /number_orders/{number_order_id}\n- \"Partially update a number_order?\" -> PATCH /number_orders/{number_order_id}\n- \"List all number_reservations?\" -> GET /number_reservations\n- \"Create a number_reservation?\" -> POST /number_reservations\n- \"Get number_reservation details?\" -> GET /number_reservations/{number_reservation_id}\n- \"Create a extend?\" -> POST /number_reservations/{number_reservation_id}/actions/extend\n- \"Create a numbers_feature?\" -> POST /numbers_features\n- \"List all authorize?\" -> GET /oauth/authorize\n- \"List all clients?\" -> GET /oauth/clients\n- \"Create a client?\" -> POST /oauth/clients\n- \"Delete a client?\" -> DELETE /oauth/clients/{id}\n- \"Get client details?\" -> GET /oauth/clients/{id}\n- \"Update a client?\" -> PUT /oauth/clients/{id}\n- \"Get consent details?\" -> GET /oauth/consent/{consent_token}\n- \"List all grants?\" -> GET /oauth/grants\n- \"Create a grant?\" -> POST /oauth/grants\n- \"Delete a grant?\" -> DELETE /oauth/grants/{id}\n- \"Get grant details?\" -> GET /oauth/grants/{id}\n- \"Create a introspect?\" -> POST /oauth/introspect\n- \"List all jwks?\" -> GET /oauth/jwks\n- \"Create a register?\" -> POST /oauth/register\n- \"Create a token?\" -> POST /oauth/token\n- \"List all oauth_clients?\" -> GET /oauth_clients\n- \"Create a oauth_client?\" -> POST /oauth_clients\n- \"Delete a oauth_client?\" -> DELETE /oauth_clients/{id}\n- \"Get oauth_client details?\" -> GET /oauth_clients/{id}\n- \"Update a oauth_client?\" -> PUT /oauth_clients/{id}\n- \"List all oauth_grants?\" -> GET /oauth_grants\n- \"Delete a oauth_grant?\" -> DELETE /oauth_grants/{id}\n- \"Get oauth_grant details?\" -> GET /oauth_grants/{id}\n- \"List all users?\" -> GET /organizations/users\n- \"List all users_groups_report?\" -> GET /organizations/users/users_groups_report\n- \"Get user details?\" -> GET /organizations/users/{id}\n- \"Create a remove?\" -> POST /organizations/users/{id}/actions/remove\n- \"List all ota_updates?\" -> GET /ota_updates\n- \"Get ota_update details?\" -> GET /ota_updates/{id}\n- \"List all outbound_voice_profiles?\" -> GET /outbound_voice_profiles\n- \"Create a outbound_voice_profile?\" -> POST /outbound_voice_profiles\n- \"Delete a outbound_voice_profile?\" -> DELETE /outbound_voice_profiles/{id}\n- \"Get outbound_voice_profile details?\" -> GET /outbound_voice_profiles/{id}\n- \"Partially update a outbound_voice_profile?\" -> PATCH /outbound_voice_profiles/{id}\n- \"List all auto_recharge_prefs?\" -> GET /payment/auto_recharge_prefs\n- \"Create a delete_phone_number_block?\" -> POST /phone_number_blocks/jobs/delete_phone_number_block\n- \"Create a verify_ownership?\" -> POST /phone_numbers/actions/verify_ownership\n- \"List all csv_downloads?\" -> GET /phone_numbers/csv_downloads\n- \"Create a csv_download?\" -> POST /phone_numbers/csv_downloads\n- \"Get csv_download details?\" -> GET /phone_numbers/csv_downloads/{id}\n- \"Create a delete_phone_number?\" -> POST /phone_numbers/jobs/delete_phone_numbers\n- \"Create a update_emergency_setting?\" -> POST /phone_numbers/jobs/update_emergency_settings\n- \"Create a update_phone_number?\" -> POST /phone_numbers/jobs/update_phone_numbers\n- \"List all regulatory_requirements?\" -> GET /phone_numbers/regulatory_requirements\n- \"List all slim?\" -> GET /phone_numbers/slim\n- \"Delete a phone_number?\" -> DELETE /phone_numbers/{id}\n- \"Create a enable_emergency?\" -> POST /phone_numbers/{id}/actions/enable_emergency\n- \"List all voicemail?\" -> GET /phone_numbers/{phone_number_id}/voicemail\n- \"Create a voicemail?\" -> POST /phone_numbers/{phone_number_id}/voicemail\n- \"List all phone_numbers_regulatory_requirements?\" -> GET /phone_numbers_regulatory_requirements\n- \"Create a portability_check?\" -> POST /portability_checks\n- \"Create a republish?\" -> POST /porting/events/{id}/republish\n- \"List all loa_configurations?\" -> GET /porting/loa_configurations\n- \"Create a loa_configuration?\" -> POST /porting/loa_configurations\n- \"Create a preview?\" -> POST /porting/loa_configurations/preview\n- \"Delete a loa_configuration?\" -> DELETE /porting/loa_configurations/{id}\n- \"Get loa_configuration details?\" -> GET /porting/loa_configurations/{id}\n- \"Partially update a loa_configuration?\" -> PATCH /porting/loa_configurations/{id}\n- \"List all preview?\" -> GET /porting/loa_configurations/{id}/preview\n- \"List all reports?\" -> GET /porting/reports\n- \"Create a report?\" -> POST /porting/reports\n- \"Get report details?\" -> GET /porting/reports/{id}\n- \"List all uk_carriers?\" -> GET /porting/uk_carriers\n- \"List all porting_orders?\" -> GET /porting_orders\n- \"Create a porting_order?\" -> POST /porting_orders\n- \"List all exception_types?\" -> GET /porting_orders/exception_types\n- \"List all phone_number_configurations?\" -> GET /porting_orders/phone_number_configurations\n- \"Create a phone_number_configuration?\" -> POST /porting_orders/phone_number_configurations\n- \"Delete a porting_order?\" -> DELETE /porting_orders/{id}\n- \"Get porting_order details?\" -> GET /porting_orders/{id}\n- \"Partially update a porting_order?\" -> PATCH /porting_orders/{id}\n- \"Create a activate?\" -> POST /porting_orders/{id}/actions/activate\n- \"Create a share?\" -> POST /porting_orders/{id}/actions/share\n- \"List all activation_jobs?\" -> GET /porting_orders/{id}/activation_jobs\n- \"Get activation_job details?\" -> GET /porting_orders/{id}/activation_jobs/{activationJobId}\n- \"Partially update a activation_job?\" -> PATCH /porting_orders/{id}/activation_jobs/{activationJobId}\n- \"List all additional_documents?\" -> GET /porting_orders/{id}/additional_documents\n- \"Create a additional_document?\" -> POST /porting_orders/{id}/additional_documents\n- \"Delete a additional_document?\" -> DELETE /porting_orders/{id}/additional_documents/{additional_document_id}\n- \"List all allowed_foc_windows?\" -> GET /porting_orders/{id}/allowed_foc_windows\n- \"List all loa_template?\" -> GET /porting_orders/{id}/loa_template\n- \"List all requirements?\" -> GET /porting_orders/{id}/requirements\n- \"List all sub_request?\" -> GET /porting_orders/{id}/sub_request\n- \"List all verification_codes?\" -> GET /porting_orders/{id}/verification_codes\n- \"List all action_requirements?\" -> GET /porting_orders/{porting_order_id}/action_requirements\n- \"Create a initiate?\" -> POST /porting_orders/{porting_order_id}/action_requirements/{id}/initiate\n- \"List all associated_phone_numbers?\" -> GET /porting_orders/{porting_order_id}/associated_phone_numbers\n- \"Create a associated_phone_number?\" -> POST /porting_orders/{porting_order_id}/associated_phone_numbers\n- \"Delete a associated_phone_number?\" -> DELETE /porting_orders/{porting_order_id}/associated_phone_numbers/{id}\n- \"List all phone_number_blocks?\" -> GET /porting_orders/{porting_order_id}/phone_number_blocks\n- \"Create a phone_number_block?\" -> POST /porting_orders/{porting_order_id}/phone_number_blocks\n- \"Delete a phone_number_block?\" -> DELETE /porting_orders/{porting_order_id}/phone_number_blocks/{id}\n- \"List all phone_number_extensions?\" -> GET /porting_orders/{porting_order_id}/phone_number_extensions\n- \"Create a phone_number_extension?\" -> POST /porting_orders/{porting_order_id}/phone_number_extensions\n- \"Delete a phone_number_extension?\" -> DELETE /porting_orders/{porting_order_id}/phone_number_extensions/{id}\n- \"List all porting_phone_numbers?\" -> GET /porting_phone_numbers\n- \"List all portouts?\" -> GET /portouts\n- \"Get rejection details?\" -> GET /portouts/rejections/{portout_id}\n- \"Get portout details?\" -> GET /portouts/{id}\n- \"List all supporting_documents?\" -> GET /portouts/{id}/supporting_documents\n- \"Create a supporting_document?\" -> POST /portouts/{id}/supporting_documents\n- \"Partially update a portout?\" -> PATCH /portouts/{id}/{status}\n- \"List all products?\" -> GET /pricing/products\n- \"Get product details?\" -> GET /pricing/products/{slug}\n- \"List all private_wireless_gateways?\" -> GET /private_wireless_gateways\n- \"Create a private_wireless_gateway?\" -> POST /private_wireless_gateways\n- \"Delete a private_wireless_gateway?\" -> DELETE /private_wireless_gateways/{id}\n- \"Get private_wireless_gateway details?\" -> GET /private_wireless_gateways/{id}\n- \"List all pronunciation_dicts?\" -> GET /pronunciation_dicts\n- \"Create a pronunciation_dict?\" -> POST /pronunciation_dicts\n- \"Delete a pronunciation_dict?\" -> DELETE /pronunciation_dicts/{id}\n- \"Get pronunciation_dict details?\" -> GET /pronunciation_dicts/{id}\n- \"Partially update a pronunciation_dict?\" -> PATCH /pronunciation_dicts/{id}\n- \"List all public_internet_gateways?\" -> GET /public_internet_gateways\n- \"Create a public_internet_gateway?\" -> POST /public_internet_gateways\n- \"Delete a public_internet_gateway?\" -> DELETE /public_internet_gateways/{id}\n- \"Get public_internet_gateway details?\" -> GET /public_internet_gateways/{id}\n- \"List all queues?\" -> GET /queues\n- \"Create a queue?\" -> POST /queues\n- \"Delete a queue?\" -> DELETE /queues/{queue_name}\n- \"Get queue details?\" -> GET /queues/{queue_name}\n- \"List all calls?\" -> GET /queues/{queue_name}/calls\n- \"Delete a call?\" -> DELETE /queues/{queue_name}/calls/{call_control_id}\n- \"Partially update a call?\" -> PATCH /queues/{queue_name}/calls/{call_control_id}\n- \"Create a agent?\" -> POST /rcs/agents\n- \"List all carrier_approvals?\" -> GET /rcs/agents/{id}/carrier_approvals\n- \"Create a launch?\" -> POST /rcs/agents/{id}/launch\n- \"List all test_devices?\" -> GET /rcs/agents/{id}/test_devices\n- \"Create a test_device?\" -> POST /rcs/agents/{id}/test_devices\n- \"Delete a test_device?\" -> DELETE /rcs/agents/{id}/test_devices/{test_device_id}\n- \"List all brands?\" -> GET /rcs/brands\n- \"Partially update a brand?\" -> PATCH /rcs/brands/{id}\n- \"List all recording_transcriptions?\" -> GET /recording_transcriptions\n- \"Delete a recording_transcription?\" -> DELETE /recording_transcriptions/{recording_transcription_id}\n- \"Get recording_transcription details?\" -> GET /recording_transcriptions/{recording_transcription_id}\n- \"Create a delete?\" -> POST /recordings/actions/delete\n- \"Delete a recording?\" -> DELETE /recordings/{recording_id}\n- \"Get recording details?\" -> GET /recordings/{recording_id}\n- \"List all regions?\" -> GET /regions\n- \"List all sync?\" -> GET /reports/cdr_usage_reports/sync\n- \"List all mdr_usage_reports?\" -> GET /reports/mdr_usage_reports\n- \"Create a mdr_usage_report?\" -> POST /reports/mdr_usage_reports\n- \"Delete a mdr_usage_report?\" -> DELETE /reports/mdr_usage_reports/{id}\n- \"Get mdr_usage_report details?\" -> GET /reports/mdr_usage_reports/{id}\n- \"List all mdrs?\" -> GET /reports/mdrs\n- \"List all wdrs?\" -> GET /reports/wdrs\n- \"List all requirement_groups?\" -> GET /requirement_groups\n- \"Delete a requirement_group?\" -> DELETE /requirement_groups/{id}\n- \"Get requirement_group details?\" -> GET /requirement_groups/{id}\n- \"Partially update a requirement_group?\" -> PATCH /requirement_groups/{id}\n- \"Create a submit_for_approval?\" -> POST /requirement_groups/{id}/submit_for_approval\n- \"List all requirement_types?\" -> GET /requirement_types\n- \"Get requirement_type details?\" -> GET /requirement_types/{id}\n- \"Get requirement details?\" -> GET /requirements/{id}\n- \"Create a version?\" -> POST /requirements/{id}/versions\n- \"List all room_compositions?\" -> GET /room_compositions\n- \"Create a room_composition?\" -> POST /room_compositions\n- \"Delete a room_composition?\" -> DELETE /room_compositions/{room_composition_id}\n- \"Get room_composition details?\" -> GET /room_compositions/{room_composition_id}\n- \"List all room_participants?\" -> GET /room_participants\n- \"Get room_participant details?\" -> GET /room_participants/{room_participant_id}\n- \"List all room_recordings?\" -> GET /room_recordings\n- \"Delete a room_recording?\" -> DELETE /room_recordings/{room_recording_id}\n- \"Get room_recording details?\" -> GET /room_recordings/{room_recording_id}\n- \"List all room_sessions?\" -> GET /room_sessions\n- \"Get room_session details?\" -> GET /room_sessions/{room_session_id}\n- \"Create a kick?\" -> POST /room_sessions/{room_session_id}/actions/kick\n- \"List all rooms?\" -> GET /rooms\n- \"Create a room?\" -> POST /rooms\n- \"Delete a room?\" -> DELETE /rooms/{room_id}\n- \"Get room details?\" -> GET /rooms/{room_id}\n- \"Partially update a room?\" -> PATCH /rooms/{room_id}\n- \"Create a generate_join_client_token?\" -> POST /rooms/{room_id}/actions/generate_join_client_token\n- \"Create a refresh_client_token?\" -> POST /rooms/{room_id}/actions/refresh_client_token\n- \"List all sessions?\" -> GET /rooms/{room_id}/sessions\n- \"List all metadata?\" -> GET /session_analysis/metadata\n- \"Get metadata details?\" -> GET /session_analysis/metadata/{record_type}\n- \"Get session_analysis details?\" -> GET /session_analysis/{record_type}/{event_id}\n- \"List all black_box_test_results?\" -> GET /seti/black_box_test_results\n- \"Get short_code details?\" -> GET /short_codes/{id}\n- \"Partially update a short_code?\" -> PATCH /short_codes/{id}\n- \"List all sim_card_actions?\" -> GET /sim_card_actions\n- \"Get sim_card_action details?\" -> GET /sim_card_actions/{id}\n- \"List all sim_card_data_usage_notifications?\" -> GET /sim_card_data_usage_notifications\n- \"Create a sim_card_data_usage_notification?\" -> POST /sim_card_data_usage_notifications\n- \"Delete a sim_card_data_usage_notification?\" -> DELETE /sim_card_data_usage_notifications/{id}\n- \"Get sim_card_data_usage_notification details?\" -> GET /sim_card_data_usage_notifications/{id}\n- \"Partially update a sim_card_data_usage_notification?\" -> PATCH /sim_card_data_usage_notifications/{id}\n- \"List all sim_card_group_actions?\" -> GET /sim_card_group_actions\n- \"Get sim_card_group_action details?\" -> GET /sim_card_group_actions/{id}\n- \"List all sim_card_groups?\" -> GET /sim_card_groups\n- \"Create a sim_card_group?\" -> POST /sim_card_groups\n- \"Delete a sim_card_group?\" -> DELETE /sim_card_groups/{id}\n- \"Get sim_card_group details?\" -> GET /sim_card_groups/{id}\n- \"Partially update a sim_card_group?\" -> PATCH /sim_card_groups/{id}\n- \"Create a remove_private_wireless_gateway?\" -> POST /sim_card_groups/{id}/actions/remove_private_wireless_gateway\n- \"Create a remove_wireless_blocklist?\" -> POST /sim_card_groups/{id}/actions/remove_wireless_blocklist\n- \"Create a set_private_wireless_gateway?\" -> POST /sim_card_groups/{id}/actions/set_private_wireless_gateway\n- \"Create a set_wireless_blocklist?\" -> POST /sim_card_groups/{id}/actions/set_wireless_blocklist\n- \"Create a sim_card_order_preview?\" -> POST /sim_card_order_preview\n- \"List all sim_card_orders?\" -> GET /sim_card_orders\n- \"Create a sim_card_order?\" -> POST /sim_card_orders\n- \"Get sim_card_order details?\" -> GET /sim_card_orders/{id}\n- \"List all sim_cards?\" -> GET /sim_cards\n- \"Create a bulk_disable_voice?\" -> POST /sim_cards/actions/bulk_disable_voice\n- \"Create a bulk_enable_voice?\" -> POST /sim_cards/actions/bulk_enable_voice\n- \"Create a bulk_set_public_ip?\" -> POST /sim_cards/actions/bulk_set_public_ips\n- \"Create a validate_registration_code?\" -> POST /sim_cards/actions/validate_registration_codes\n- \"Delete a sim_card?\" -> DELETE /sim_cards/{id}\n- \"Get sim_card details?\" -> GET /sim_cards/{id}\n- \"Partially update a sim_card?\" -> PATCH /sim_cards/{id}\n- \"Create a disable_voice?\" -> POST /sim_cards/{id}/actions/disable_voice\n- \"Create a enable_voice?\" -> POST /sim_cards/{id}/actions/enable_voice\n- \"Create a remove_public_ip?\" -> POST /sim_cards/{id}/actions/remove_public_ip\n- \"Create a set_public_ip?\" -> POST /sim_cards/{id}/actions/set_public_ip\n- \"Create a set_standby?\" -> POST /sim_cards/{id}/actions/set_standby\n- \"List all activation_code?\" -> GET /sim_cards/{id}/activation_code\n- \"List all device_details?\" -> GET /sim_cards/{id}/device_details\n- \"List all public_ip?\" -> GET /sim_cards/{id}/public_ip\n- \"List all wireless_connectivity_logs?\" -> GET /sim_cards/{id}/wireless_connectivity_logs\n- \"Create a siprec_connector?\" -> POST /siprec_connectors\n- \"Delete a siprec_connector?\" -> DELETE /siprec_connectors/{connector_name}\n- \"Get siprec_connector details?\" -> GET /siprec_connectors/{connector_name}\n- \"Update a siprec_connector?\" -> PUT /siprec_connectors/{connector_name}\n- \"List all providers?\" -> GET /speech-to-text/providers\n- \"List all transcription?\" -> GET /speech-to-text/transcription\n- \"List all spend_limits?\" -> GET /spend_limits\n- \"Create a spend_limit?\" -> POST /spend_limits\n- \"Delete a spend_limit?\" -> DELETE /spend_limits/{product}\n- \"Partially update a spend_limit?\" -> PATCH /spend_limits/{product}\n- \"List all ssl_certificate?\" -> GET /storage/buckets/{bucketName}/ssl_certificate\n- \"List all api?\" -> GET /storage/buckets/{bucketName}/usage/api\n- \"List all storage?\" -> GET /storage/buckets/{bucketName}/usage/storage\n- \"Create a presigned_url?\" -> POST /storage/buckets/{bucketName}/{objectName}/presigned_url\n- \"List all cloudfs?\" -> GET /storage/cloudfs\n- \"Create a cloudf?\" -> POST /storage/cloudfs\n- \"Delete a cloudf?\" -> DELETE /storage/cloudfs/{id}\n- \"Get cloudf details?\" -> GET /storage/cloudfs/{id}\n- \"Partially update a cloudf?\" -> PATCH /storage/cloudfs/{id}\n- \"Create a rotate-meta-token?\" -> POST /storage/cloudfs/{id}/actions/rotate-meta-token\n- \"List all kvs?\" -> GET /storage/kvs\n- \"Create a kv?\" -> POST /storage/kvs\n- \"Delete a kv?\" -> DELETE /storage/kvs/{id}\n- \"Get kv details?\" -> GET /storage/kvs/{id}\n- \"List all keys?\" -> GET /storage/kvs/{id}/keys\n- \"Delete a key?\" -> DELETE /storage/kvs/{id}/keys/{key}\n- \"Get key details?\" -> GET /storage/kvs/{id}/keys/{key}\n- \"Update a key?\" -> PUT /storage/kvs/{id}/keys/{key}\n- \"List all migration_source_coverage?\" -> GET /storage/migration_source_coverage\n- \"List all migration_sources?\" -> GET /storage/migration_sources\n- \"Create a migration_source?\" -> POST /storage/migration_sources\n- \"Delete a migration_source?\" -> DELETE /storage/migration_sources/{id}\n- \"Get migration_source details?\" -> GET /storage/migration_sources/{id}\n- \"List all migrations?\" -> GET /storage/migrations\n- \"Create a migration?\" -> POST /storage/migrations\n- \"Get migration details?\" -> GET /storage/migrations/{id}\n- \"List all sqldbs?\" -> GET /storage/sqldbs\n- \"Create a sqldb?\" -> POST /storage/sqldbs\n- \"Delete a sqldb?\" -> DELETE /storage/sqldbs/{id}\n- \"Get sqldb details?\" -> GET /storage/sqldbs/{id}\n- \"Create a query?\" -> POST /storage/sqldbs/{id}/actions/query\n- \"List all sub_number_orders?\" -> GET /sub_number_orders\n- \"Partially update a sub_number_order?\" -> PATCH /sub_number_orders/{sub_number_order_id}\n- \"Create a sub_number_orders_report?\" -> POST /sub_number_orders_report\n- \"Get sub_number_orders_report details?\" -> GET /sub_number_orders_report/{report_id}\n- \"List all telephony_credentials?\" -> GET /telephony_credentials\n- \"Create a telephony_credential?\" -> POST /telephony_credentials\n- \"Delete a telephony_credential?\" -> DELETE /telephony_credentials/{id}\n- \"Get telephony_credential details?\" -> GET /telephony_credentials/{id}\n- \"Partially update a telephony_credential?\" -> PATCH /telephony_credentials/{id}\n- \"List all agreements?\" -> GET /terms_of_service/agreements\n- \"Get agreement details?\" -> GET /terms_of_service/agreements/{agreement_id}\n- \"Create a agree?\" -> POST /terms_of_service/branded_calling/agree\n- \"List all info?\" -> GET /terms_of_service/info\n- \"List all Calls?\" -> GET /texml/Accounts/{account_sid}/Calls\n- \"Create a Call?\" -> POST /texml/Accounts/{account_sid}/Calls\n- \"Get Call details?\" -> GET /texml/Accounts/{account_sid}/Calls/{call_sid}\n- \"List all Recordings.json?\" -> GET /texml/Accounts/{account_sid}/Calls/{call_sid}/Recordings.json\n- \"Create a Recordings.json?\" -> POST /texml/Accounts/{account_sid}/Calls/{call_sid}/Recordings.json\n- \"Create a Siprec.json?\" -> POST /texml/Accounts/{account_sid}/Calls/{call_sid}/Siprec.json\n- \"Create a Streams.json?\" -> POST /texml/Accounts/{account_sid}/Calls/{call_sid}/Streams.json\n- \"List all Conferences?\" -> GET /texml/Accounts/{account_sid}/Conferences\n- \"Get Conference details?\" -> GET /texml/Accounts/{account_sid}/Conferences/{conference_sid}\n- \"List all Participants?\" -> GET /texml/Accounts/{account_sid}/Conferences/{conference_sid}/Participants\n- \"Create a Participant?\" -> POST /texml/Accounts/{account_sid}/Conferences/{conference_sid}/Participants\n- \"Delete a Participant?\" -> DELETE /texml/Accounts/{account_sid}/Conferences/{conference_sid}/Participants/{call_sid_or_participant_label}\n- \"Get Participant details?\" -> GET /texml/Accounts/{account_sid}/Conferences/{conference_sid}/Participants/{call_sid_or_participant_label}\n- \"List all Recordings?\" -> GET /texml/Accounts/{account_sid}/Conferences/{conference_sid}/Recordings\n- \"List all Queues?\" -> GET /texml/Accounts/{account_sid}/Queues\n- \"Create a Queue?\" -> POST /texml/Accounts/{account_sid}/Queues\n- \"Delete a Queue?\" -> DELETE /texml/Accounts/{account_sid}/Queues/{queue_sid}\n- \"Get Queue details?\" -> GET /texml/Accounts/{account_sid}/Queues/{queue_sid}\n- \"Delete a Recording?\" -> DELETE /texml/Accounts/{account_sid}/Recordings/{recording_sid}.json\n- \"Get Recording details?\" -> GET /texml/Accounts/{account_sid}/Recordings/{recording_sid}.json\n- \"List all Transcriptions.json?\" -> GET /texml/Accounts/{account_sid}/Transcriptions.json\n- \"Delete a Transcription?\" -> DELETE /texml/Accounts/{account_sid}/Transcriptions/{recording_transcription_sid}.json\n- \"Get Transcription details?\" -> GET /texml/Accounts/{account_sid}/Transcriptions/{recording_transcription_sid}.json\n- \"List all texml_applications?\" -> GET /texml_applications\n- \"Create a texml_application?\" -> POST /texml_applications\n- \"Delete a texml_application?\" -> DELETE /texml_applications/{id}\n- \"Get texml_application details?\" -> GET /texml_applications/{id}\n- \"Partially update a texml_application?\" -> PATCH /texml_applications/{id}\n- \"List all speech?\" -> GET /text-to-speech/speech\n- \"Create a speech?\" -> POST /text-to-speech/speech\n- \"List all voices?\" -> GET /text-to-speech/voices\n- \"Create a profile?\" -> POST /traffic/policy/profiles\n- \"List all services?\" -> GET /traffic/policy/profiles/services\n- \"Get profile details?\" -> GET /traffic/policy/profiles/{id}\n- \"Partially update a profile?\" -> PATCH /traffic/policy/profiles/{id}\n- \"List all traffic_policy_profiles?\" -> GET /traffic_policy_profiles\n- \"Create a traffic_policy_profile?\" -> POST /traffic_policy_profiles\n- \"Delete a traffic_policy_profile?\" -> DELETE /traffic_policy_profiles/{id}\n- \"Get traffic_policy_profile details?\" -> GET /traffic_policy_profiles/{id}\n- \"Partially update a traffic_policy_profile?\" -> PATCH /traffic_policy_profiles/{id}\n- \"List all uac_connections?\" -> GET /uac_connections\n- \"Create a uac_connection?\" -> POST /uac_connections\n- \"Delete a uac_connection?\" -> DELETE /uac_connections/{id}\n- \"Get uac_connection details?\" -> GET /uac_connections/{id}\n- \"Partially update a uac_connection?\" -> PATCH /uac_connections/{id}\n- \"List all usage_reports?\" -> GET /usage_reports\n- \"List all options?\" -> GET /usage_reports/options\n- \"List all user_addresses?\" -> GET /user_addresses\n- \"Create a user_addresse?\" -> POST /user_addresses\n- \"Get user_addresse details?\" -> GET /user_addresses/{id}\n- \"List all user_tags?\" -> GET /user_tags\n- \"Create a bot_challenge?\" -> POST /v2/bot_challenge\n- \"List all bot_sessions?\" -> GET /v2/bot_sessions\n- \"Create a bot_signup?\" -> POST /v2/bot_signup\n- \"Create a resend_magic_link?\" -> POST /v2/bot_signup/resend_magic_link\n- \"List all mobile_phone_numbers?\" -> GET /v2/mobile_phone_numbers\n- \"Get mobile_phone_number details?\" -> GET /v2/mobile_phone_numbers/{id}\n- \"Partially update a mobile_phone_number?\" -> PATCH /v2/mobile_phone_numbers/{id}\n- \"List all mobile_voice_connections?\" -> GET /v2/mobile_voice_connections\n- \"Create a mobile_voice_connection?\" -> POST /v2/mobile_voice_connections\n- \"Delete a mobile_voice_connection?\" -> DELETE /v2/mobile_voice_connections/{id}\n- \"Get mobile_voice_connection details?\" -> GET /v2/mobile_voice_connections/{id}\n- \"Partially update a mobile_voice_connection?\" -> PATCH /v2/mobile_voice_connections/{id}\n- \"Create a stored_payment_transaction?\" -> POST /v2/payment/stored_payment_transactions\n- \"List all business_accounts?\" -> GET /v2/whatsapp/business_accounts\n- \"Delete a business_account?\" -> DELETE /v2/whatsapp/business_accounts/{id}\n- \"Get business_account details?\" -> GET /v2/whatsapp/business_accounts/{id}\n- \"List all message_templates?\" -> GET /v2/whatsapp/message_templates\n- \"Create a message_template?\" -> POST /v2/whatsapp/message_templates\n- \"List all calling_settings?\" -> GET /v2/whatsapp/phone_numbers/{phone_number}/calling_settings\n- \"List all conversation_window?\" -> GET /v2/whatsapp/phone_numbers/{phone_number}/conversation_window\n- \"List all conversational_components?\" -> GET /v2/whatsapp/phone_numbers/{phone_number}/conversational_components\n- \"List all profile?\" -> GET /v2/whatsapp/phone_numbers/{phone_number}/profile\n- \"List all photo?\" -> GET /v2/whatsapp/phone_numbers/{phone_number}/profile/photo\n- \"Create a photo?\" -> POST /v2/whatsapp/phone_numbers/{phone_number}/profile/photo\n- \"Create a resend_verification?\" -> POST /v2/whatsapp/phone_numbers/{phone_number}/resend_verification\n- \"List all user_data?\" -> GET /v2/whatsapp/user_data\n- \"Delete a whatsapp_message_template?\" -> DELETE /v2/whatsapp_message_templates/{id}\n- \"Get whatsapp_message_template details?\" -> GET /v2/whatsapp_message_templates/{id}\n- \"Partially update a whatsapp_message_template?\" -> PATCH /v2/whatsapp_message_templates/{id}\n- \"Get by_phone_number details?\" -> GET /verifications/by_phone_number/{phone_number}\n- \"Create a flashcall?\" -> POST /verifications/flashcall\n- \"Get verification details?\" -> GET /verifications/{verification_id}\n- \"List all verified_numbers?\" -> GET /verified_numbers\n- \"Create a verified_number?\" -> POST /verified_numbers\n- \"Delete a verified_number?\" -> DELETE /verified_numbers/{phone_number}\n- \"Get verified_number details?\" -> GET /verified_numbers/{phone_number}\n- \"List all verify_profiles?\" -> GET /verify_profiles\n- \"Create a verify_profile?\" -> POST /verify_profiles\n- \"List all templates?\" -> GET /verify_profiles/templates\n- \"Create a template?\" -> POST /verify_profiles/templates\n- \"Partially update a template?\" -> PATCH /verify_profiles/templates/{template_id}\n- \"Delete a verify_profile?\" -> DELETE /verify_profiles/{verify_profile_id}\n- \"Get verify_profile details?\" -> GET /verify_profiles/{verify_profile_id}\n- \"Partially update a verify_profile?\" -> PATCH /verify_profiles/{verify_profile_id}\n- \"List all virtual_cross_connects?\" -> GET /virtual_cross_connects\n- \"Create a virtual_cross_connect?\" -> POST /virtual_cross_connects\n- \"List all coverage?\" -> GET /virtual_cross_connects/coverage\n- \"Delete a virtual_cross_connect?\" -> DELETE /virtual_cross_connects/{id}\n- \"Get virtual_cross_connect details?\" -> GET /virtual_cross_connects/{id}\n- \"Partially update a virtual_cross_connect?\" -> PATCH /virtual_cross_connects/{id}\n- \"List all virtual_cross_connects_coverage?\" -> GET /virtual_cross_connects_coverage\n- \"List all voice_clones?\" -> GET /voice_clones\n- \"Create a voice_clone?\" -> POST /voice_clones\n- \"Create a from_upload?\" -> POST /voice_clones/from_upload\n- \"Delete a voice_clone?\" -> DELETE /voice_clones/{id}\n- \"Partially update a voice_clone?\" -> PATCH /voice_clones/{id}\n- \"List all sample?\" -> GET /voice_clones/{id}/sample\n- \"List all voice_designs?\" -> GET /voice_designs\n- \"Create a voice_design?\" -> POST /voice_designs\n- \"Delete a voice_design?\" -> DELETE /voice_designs/{id}\n- \"Get voice_design details?\" -> GET /voice_designs/{id}\n- \"Partially update a voice_design?\" -> PATCH /voice_designs/{id}\n- \"List all voice_sdk_call_reports?\" -> GET /voice_sdk_call_reports\n- \"Get voice_sdk_call_report details?\" -> GET /voice_sdk_call_reports/{call_id}\n- \"Create a web_search?\" -> POST /web_search\n- \"Create a content?\" -> POST /web_search/contents\n- \"Create a research?\" -> POST /web_search/research\n- \"Get research details?\" -> GET /web_search/research/{task_id}\n- \"List all webhook_deliveries?\" -> GET /webhook_deliveries\n- \"Get webhook_delivery details?\" -> GET /webhook_deliveries/{id}\n- \"Delete a message_template?\" -> DELETE /whatsapp/message_templates/{id}\n- \"Get message_template details?\" -> GET /whatsapp/message_templates/{id}\n- \"Partially update a message_template?\" -> PATCH /whatsapp/message_templates/{id}\n- \"List all wireguard_interfaces?\" -> GET /wireguard_interfaces\n- \"Create a wireguard_interface?\" -> POST /wireguard_interfaces\n- \"Delete a wireguard_interface?\" -> DELETE /wireguard_interfaces/{id}\n- \"Get wireguard_interface details?\" -> GET /wireguard_interfaces/{id}\n- \"List all wireguard_peers?\" -> GET /wireguard_peers\n- \"Create a wireguard_peer?\" -> POST /wireguard_peers\n- \"Delete a wireguard_peer?\" -> DELETE /wireguard_peers/{id}\n- \"Get wireguard_peer details?\" -> GET /wireguard_peers/{id}\n- \"Partially update a wireguard_peer?\" -> PATCH /wireguard_peers/{id}\n- \"List all config?\" -> GET /wireguard_peers/{id}/config\n- \"Delete a report?\" -> DELETE /wireless/detail/records/reports/{id}\n- \"List all detail_records_reports?\" -> GET /wireless/detail_records_reports\n- \"Create a detail_records_report?\" -> POST /wireless/detail_records_reports\n- \"Delete a detail_records_report?\" -> DELETE /wireless/detail_records_reports/{id}\n- \"Get detail_records_report details?\" -> GET /wireless/detail_records_reports/{id}\n- \"List all wireless_blocklist_values?\" -> GET /wireless_blocklist_values\n- \"List all wireless_blocklists?\" -> GET /wireless_blocklists\n- \"Create a wireless_blocklist?\" -> POST /wireless_blocklists\n- \"Delete a wireless_blocklist?\" -> DELETE /wireless_blocklists/{id}\n- \"Get wireless_blocklist details?\" -> GET /wireless_blocklists/{id}\n- \"Partially update a wireless_blocklist?\" -> PATCH /wireless_blocklists/{id}\n- \"Create a credit_account?\" -> POST /x402/credit_account\n- \"List all payments?\" -> GET /x402/credit_account/payments\n- \"Get payment details?\" -> GET /x402/credit_account/payments/{id}\n- \"Create a quote?\" -> POST /x402/credit_account/quote\n- \"How to authenticate?\" -> See Auth section above\n\n## Response Tips\n- Check response schemas in references/api-spec.lap for field details\n- Paginated endpoints accept limit/offset or cursor parameters\n- Create/update endpoints return the modified resource on success\n- Error responses include status codes and descriptions in the spec\n\n## References\n- Full spec: See references/api-spec.lap for complete endpoint details, parameter tables, and response schemas\n\n> Generated from the official API spec by [LAP](https://lap.sh)\n","references/api-spec.lap":"@lap v0.3\n# Machine-readable API spec. Each @endpoint block is one API call.\n@api Telnyx API\n@base https://api.telnyx.com/v2\n@version 2.0.0\n@auth Bearer bearer | ApiKey Authorization in header | Bearer bearer | Bearer bearer | Bearer bearer | Bearer bearer | Bearer bearer | OAuth2 | Bearer bearer | Bearer bearer | Bearer bearer | Bearer bearer | Bearer bearer | Bearer bearer\n@endpoints 1379\n@hint download_for_search\n@toc .well-known(2), 10dlc(45), access_ip_address(4), access_ip_ranges(3), actions(2), addresses(6), advanced_orders(4), ai(176), alphanumeric_sender_ids(4), audit_events(1), authentication_providers(5), available_phone_number_blocks(1), available_phone_numbers(1), balance(1), billing_groups(5), bulk_sim_card_actions(2), bundle_pricing(8), call_control_applications(5), call_events(1), call_reasons(2), calls(43), channel_zones(2), charges_breakdown(1), charges_summary(1), comments(4), compute(7), conferences(23), connections(4), country_coverage(2), credential_connections(6), custom_storage_credentials(4), customer_service_records(4), detail_records(1), dialogflow_connections(4), dir(22), document_links(1), documents(7), dynamic_emergency_addresses(4), dynamic_emergency_endpoints(4), email_blocks(8), email_domains(14), email_events(2), email_inboxes(27), email_messages(11), email_templates(7), email_threads(2), email_unsubscribe_groups(8), email_validations(3), enterprises(22), external_connections(22), external_requirements(2), fax_applications(5), faxes(6), fqdn_connections(7), fqdns(5), global_ip_allowed_ports(1), global_ip_assignment_health(1), global_ip_assignments(6), global_ip_assignments_usage(1), global_ip_health_check_types(1), global_ip_health_checks(4), global_ip_latency(1), global_ip_protocols(1), global_ip_usage(1), global_ips(4), inbound_channels(2), inexplicit_number_orders(3), infringement_claims(2), integration_secrets(3), inventory_coverage(1), invoices(2), ip_connections(5), ips(5), ledger_billing_group_reports(2), legacy(30), legacy_reporting(22), list(2), machine-payments(1), managed_accounts(8), media(6), meeting_sessions(15), messages(15), messaging(11), messaging_hosted_number_orders(8), messaging_hosted_numbers(4), messaging_numbers(2), messaging_numbers_bulk_updates(2), messaging_optouts(1), messaging_profile_metrics(1), messaging_profiles(15), messaging_tollfree(6), messaging_url_domains(1), mobile_network_operators(1), mobile_phone_numbers(5), mobile_push_credentials(4), network_coverage(1), networks(9), noise_suppression_engines(1), notification_channels(5), notification_event_conditions(1), notification_events(1), notification_profiles(5), notification_settings(4), number_block_orders(3), number_lookup(1), number_order_phone_numbers(4), number_orders(4), number_reservations(4), numbers_features(1), oauth(15), oauth_clients(5), oauth_grants(3), operator_connect(1), organizations(4), ota_updates(2), outbound_voice_profiles(5), payment(3), phone_number_blocks(3), phone_numbers(26), phone_numbers_regulatory_requirements(1), portability_checks(1), porting(14), porting_orders(38), porting_phone_numbers(1), portouts(14), pricing(2), private_wireless_gateways(4), pronunciation_dicts(5), public_internet_gateways(4), queues(9), rcs(15), recording_transcriptions(3), recordings(4), regions(1), regulatory_requirements(1), reports(8), reputation(3), requirement_groups(6), requirement_types(2), requirements(4), room_compositions(4), room_participants(2), room_recordings(4), room_sessions(7), rooms(8), session_analysis(3), seti(1), short_codes(3), sim_card_actions(2), sim_card_data_usage_notifications(5), sim_card_group_actions(2), sim_card_groups(9), sim_card_order_preview(1), sim_card_orders(3), sim_cards(19), siprec_connectors(4), speech-to-text(2), storage(34), sub_number_orders(8), sub_number_orders_report(3), telephony_credentials(6), terms_of_service(6), texml(35), texml_applications(5), text-to-speech(3), traffic(6), traffic_policy_profiles(6), uac_connections(6), usage_reports(2), user(3), user_addresses(3), user_tags(1), bot_challenge(1), bot_sessions(1), bot_signup(2), mobile_voice_connections(5), whatsapp(53), whatsapp_message_templates(3), verifications(8), verified_numbers(5), verify_profiles(8), virtual_cross_connects(6), virtual_cross_connects_coverage(1), voice_clones(6), voice_designs(7), voice_sdk_call_reports(2), web_search(4), webhook_deliveries(2), wireguard_interfaces(4), wireguard_peers(6), wireless(9), wireless_blocklist_values(1), wireless_blocklists(5), x402(4)\n\n@group .well-known\n@endpoint GET /.well-known/oauth-authorization-server\n@desc Authorization server metadata\n@returns(200) {issuer: str(uri), token_endpoint: str(uri), introspection_endpoint: str(uri), jwks_uri: str(uri), registration_endpoint: str(uri), authorization_endpoint: str(uri), grant_types_supported: [str], code_challenge_methods_supported: [str], response_types_supported: [str], token_endpoint_auth_methods_supported: [str], scopes_supported: [str]} # Authorization server metadata\n@errors {400: Bad Request, 401: Unauthorized}\n\n@endpoint GET /.well-known/oauth-protected-resource\n@desc Protected resource metadata\n@returns(200) {resource: str(uri), authorization_servers: [str(uri)]} # Protected resource metadata\n@errors {400: Bad Request, 401: Unauthorized}\n\n@endgroup\n\n@group 10dlc\n@endpoint GET /10dlc/brand\n@desc List Brands\n@optional {page: int=1 # Page number to retrieve (1-based)., recordsPerPage: int=10 # number of records per page. maximum of 500, sort: str(assignedCampaignsCount/-assignedCampaignsCount/brandId/-brandId/createdAt/-createdAt/displayName/-displayName/identityStatus/-identityStatus/status/-status/tcrBrandId/-tcrBrandId)=-createdAt # Specifies the sort order for results. If not given, results are sorted by createdAt in descending order., displayName: str # Filter results by display name., entityType: str # Filter results by entity type., state: str # Filter results by state., country: str # Filter results by country., brandId: str # Filter results by the Telnyx Brand id, tcrBrandId: str # Filter results by the TCR Brand id}\n@returns(200) {records: [map], page: int, totalRecords: int} # Successful Response\n@errors {4XX: Generic response error}\n\n@endpoint POST /10dlc/brand\n@desc Create Brand\n@required {entityType: any # Entity type behind the brand. This is the form of business establishment., displayName: str # Display name, marketing name, or DBA name of the brand., country: str # ISO2 2 characters country code. Example: US - United States, email: str # Valid email address of brand support contact., vertical: any # Vertical or industry segment of the brand.}\n@optional {companyName: str # (Required for Non-profit/private/public) Legal company name., firstName: str # First name of business contact., lastName: str # Last name of business contact., ein: str # (Required for Non-profit) Government assigned corporate tax ID. EIN is 9-digits in U.S., phone: str # Valid phone number in e.164 international format., street: str # Street number and name., city: str # City name, state: str # State. Must be 2 letters code for United States., postalCode: str # Postal codes. Use 5 digit zipcode for United States, stockSymbol: str # (Required for public company) stock symbol., stockExchange: any # (Required for public company) stock exchange., ipAddress: str # IP address of the browser requesting to create brand identity., website: str # Brand website URL., isReseller: bool=false, mock: bool=false # Mock brand for testing purposes. Defaults to false., mobilePhone: str # Valid mobile phone number in e.164 international format., businessContactEmail: str # Business contact email.  Required if `entityType` is `PUBLIC_PROFIT`. Otherwise, it is recommended to either omit this field or set it to `null`., webhookURL: str # Webhook URL for brand status updates., webhookFailoverURL: str # Webhook failover URL for brand status updates.}\n@returns(200) {entityType: any, cspId: str, brandId: str, tcrBrandId: str, displayName: str, companyName: str, firstName: str, lastName: str, ein: str, phone: str, street: str, city: str, state: str, postalCode: str, country: str, email: str, stockSymbol: str, stockExchange: any, ipAddress: str, website: str, brandRelationship: any, vertical: str, altBusinessId: str, altBusinessIdType: str, universalEin: str, referenceId: str, identityStatus: str, optionalAttributes: map{taxExemptStatus: str}, mock: bool, mobilePhone: str, isReseller: bool, webhookURL: str, businessContactEmail: str, webhookFailoverURL: str, createdAt: str, updatedAt: str, status: str, failureReasons: str} # Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint GET /10dlc/brand/feedback/{brandId}\n@desc Get Brand Feedback By Id\n@required {brandId: str # Unique identifier of the brand.}\n@returns(200) {brandId: str, category: [map]} # Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint GET /10dlc/brand/smsOtp/{referenceId}\n@desc Get Brand SMS OTP Status\n@required {referenceId: str # The reference ID returned when the OTP was initially triggered}\n@optional {brandId: str # Filter by Brand ID for easier lookup in portal applications}\n@returns(200) {brandId: str, referenceId: str, mobilePhone: str, requestDate: str(date-time), verifyDate: str(date-time), deliveryStatus: str, deliveryStatusDate: str(date-time), deliveryStatusDetails: str} # Successful Response\n@errors {404: OTP reference not found, 422: Validation Error, 4XX: Generic response error}\n\n@endpoint DELETE /10dlc/brand/{brandId}\n@desc Delete Brand\n@required {brandId: str # Unique identifier of the brand.}\n@returns(204) Brand removed successfully\n@errors {400: Brand cannot be deleted, 404: Brand not found, 422: Validation Error, 4XX: Generic response error}\n\n@endpoint GET /10dlc/brand/{brandId}\n@desc Get Brand\n@required {brandId: str # Unique identifier of the brand.}\n@returns(200) Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint PUT /10dlc/brand/{brandId}\n@desc Update Brand\n@required {brandId: str # Unique identifier of the brand., entityType: any # Entity type behind the brand. This is the form of business establishment., displayName: str # Display or marketing name of the brand., country: str # ISO2 2 characters country code. Example: US - United States, email: str # Valid email address of brand support contact., vertical: any # Vertical or industry segment of the brand.}\n@optional {companyName: str # (Required for Non-profit/private/public) Legal company name., firstName: str # First name of business contact., lastName: str # Last name of business contact., ein: str # (Required for Non-profit) Government assigned corporate tax ID. EIN is 9-digits in U.S., phone: str # Valid phone number in e.164 international format., street: str # Street number and name., city: str # City name, state: str # State. Must be 2 letters code for United States., postalCode: str # Postal codes. Use 5 digit zipcode for United States, stockSymbol: str # (Required for public company) stock symbol., stockExchange: any # (Required for public company) stock exchange., ipAddress: str # IP address of the browser requesting to create brand identity., website: str # Brand website URL., altBusinessIdType: str(NONE/DUNS/GIIN/LEI) # An enumeration., isReseller: bool, identityStatus: str(VERIFIED/UNVERIFIED/SELF_DECLARED/VETTED_VERIFIED) # The verification status of an active brand, businessContactEmail: str # Business contact email.  Required if `entityType` will be changed to `PUBLIC_PROFIT`. Otherwise, it is recommended to either omit this field or set it to `null`., webhookURL: str # Webhook URL for brand status updates., webhookFailoverURL: str # Webhook failover URL for brand status updates., altBusinessId: str # Alternate business identifier such as DUNS, LEI, or GIIN}\n@returns(200) {entityType: any, cspId: str, brandId: str, tcrBrandId: str, displayName: str, companyName: str, firstName: str, lastName: str, ein: str, phone: str, street: str, city: str, state: str, postalCode: str, country: str, email: str, stockSymbol: str, stockExchange: any, ipAddress: str, website: str, brandRelationship: any, vertical: str, altBusinessId: str, altBusinessIdType: str, universalEin: str, referenceId: str, identityStatus: str, optionalAttributes: map{taxExemptStatus: str}, mock: bool, mobilePhone: str, isReseller: bool, webhookURL: str, businessContactEmail: str, webhookFailoverURL: str, createdAt: str, updatedAt: str, status: str, failureReasons: str} # Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint POST /10dlc/brand/{brandId}/2faEmail\n@desc Resend brand 2FA email\n@required {brandId: str # Unique identifier of the brand.}\n@returns(200) Successful Response\n@errors {4XX: Generic response error}\n\n@endpoint GET /10dlc/brand/{brandId}/externalVetting\n@desc List External Vettings\n@required {brandId: str # Unique identifier of the brand.}\n@returns(200) Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint POST /10dlc/brand/{brandId}/externalVetting\n@desc Order Brand External Vetting\n@required {brandId: str # Unique identifier of the brand., evpId: str # External vetting provider ID for the brand., vettingClass: str # Identifies the vetting classification.}\n@returns(200) {evpId: str, vettingId: str, vettingToken: str, vettingScore: int, vettingClass: str, vettedDate: str, createDate: str} # Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n@example_request {\"evpId\":\"Evpid\",\"vettingClass\":\"Vettingclass\"}\n\n@endpoint PUT /10dlc/brand/{brandId}/externalVetting\n@desc Import External Vetting Record\n@required {brandId: str # Unique identifier of the brand., evpId: str # External vetting provider ID for the brand., vettingId: str # Unique ID that identifies a vetting transaction performed by a vetting provider. This ID is provided by the vetting provider at time of vetting.}\n@optional {vettingToken: str # Required by some providers for vetting record confirmation.}\n@returns(200) {evpId: str, vettingId: str, vettingToken: str, vettingScore: int, vettingClass: str, vettedDate: str, createDate: str} # Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n@example_request {\"evpId\":\"Evpid\",\"vettingId\":\"Vettingid\",\"vettingToken\":\"Vettingtoken\"}\n\n@endpoint PUT /10dlc/brand/{brandId}/revet\n@desc Revet Brand\n@required {brandId: str # Unique identifier of the brand.}\n@returns(200) {entityType: any, cspId: str, brandId: str, tcrBrandId: str, displayName: str, companyName: str, firstName: str, lastName: str, ein: str, phone: str, street: str, city: str, state: str, postalCode: str, country: str, email: str, stockSymbol: str, stockExchange: any, ipAddress: str, website: str, brandRelationship: any, vertical: str, altBusinessId: str, altBusinessIdType: str, universalEin: str, referenceId: str, identityStatus: str, optionalAttributes: map{taxExemptStatus: str}, mock: bool, mobilePhone: str, isReseller: bool, webhookURL: str, businessContactEmail: str, webhookFailoverURL: str, createdAt: str, updatedAt: str, status: str, failureReasons: str} # Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint GET /10dlc/brand/{brandId}/smsOtp\n@desc Get Brand SMS OTP Status by Brand ID\n@required {brandId: str # The Brand ID for which to query OTP status}\n@returns(200) {brandId: str, referenceId: str, mobilePhone: str, requestDate: str(date-time), verifyDate: str(date-time), deliveryStatus: str, deliveryStatusDate: str(date-time), deliveryStatusDetails: str} # Successful Response\n@errors {404: OTP status not found for this brand, 422: Validation Error, 4XX: Generic response error}\n\n@endpoint POST /10dlc/brand/{brandId}/smsOtp\n@desc Trigger Brand SMS OTP\n@required {brandId: str # The Brand ID for which to trigger the OTP, pinSms: str # SMS message template to send the OTP. Must include `@OTP_PIN@` placeholder which will be replaced with the actual PIN, successSms: str # SMS message to send upon successful OTP verification}\n@returns(200) {brandId: str, referenceId: str} # Successful Response\n@errors {400: Bad Request - Brand is not a Sole Proprietor or invalid mobile phone number, 422: Validation Error, 4XX: Generic response error}\n\n@endpoint PUT /10dlc/brand/{brandId}/smsOtp\n@desc Verify Brand SMS OTP\n@required {brandId: str # The Brand ID for which to verify the OTP, otpPin: str # The OTP PIN received via SMS}\n@returns(204) OTP verified successfully - No content returned\n@errors {400: Bad Request - Invalid or expired OTP, 422: Validation Error, 4XX: Generic response error}\n\n@endpoint GET /10dlc/brand_feedback/{brandId}\n@desc Get Brand Feedback By Id\n@required {brandId: str # Unique identifier of the brand.}\n@returns(200) {brandId: str, category: [map]} # Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint GET /10dlc/campaign\n@desc List Campaigns\n@required {brandId: str # Filter results by brand id.}\n@optional {page: int=1 # The 1-indexed page number to get. The default value is `1`., recordsPerPage: int=10 # The amount of records per page, limited to between 1 and 500 inclusive. The default value is `10`., sort: str(assignedPhoneNumbersCount/-assignedPhoneNumbersCount/campaignId/-campaignId/createdAt/-createdAt/status/-status/tcrCampaignId/-tcrCampaignId)=-createdAt # Specifies the sort order for results. If not given, results are sorted by createdAt in descending order.}\n@returns(200) {records: [map], page: int, totalRecords: int} # Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint POST /10dlc/campaign/acceptSharing/{campaignId}\n@desc Accept Shared Campaign\n@required {campaignId: str # TCR's ID for the campaign to import}\n@returns(202) Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint GET /10dlc/campaign/usecase/cost\n@desc Get Campaign Cost\n@required {usecase: str # Filter results by usecase.}\n@returns(200) {campaignUsecase: str, monthlyCost: str, upFrontCost: str, description: str} # Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint GET /10dlc/campaign/usecase_cost\n@desc Get Campaign Cost\n@required {usecase: str # Filter results by usecase.}\n@returns(200) {campaignUsecase: str, monthlyCost: str, upFrontCost: str, description: str} # Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint DELETE /10dlc/campaign/{campaignId}\n@desc Deactivate campaign\n@required {campaignId: str # Unique identifier of the campaign.}\n@returns(200) {time: num, record_type: str, message: str} # Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint GET /10dlc/campaign/{campaignId}\n@desc Get campaign\n@required {campaignId: str # Unique identifier of the campaign.}\n@returns(200) {ageGated: bool, autoRenewal: bool, billedDate: str, brandId: str, brandDisplayName: str, campaignId: str, tcrBrandId: str, tcrCampaignId: str, createDate: str, cspId: str, description: str, directLending: bool, embeddedLink: bool, embeddedPhone: bool, helpKeywords: str, helpMessage: str, messageFlow: str, mock: bool, nextRenewalOrExpirationDate: str, numberPool: bool, optinKeywords: str, optinMessage: str, optoutKeywords: str, optoutMessage: str, referenceId: str, resellerId: str, sample1: str, sample2: str, sample3: str, sample4: str, sample5: str, status: str, subUsecases: [str], subscriberHelp: bool, subscriberOptin: bool, subscriberOptout: bool, termsAndConditions: bool, usecase: str, vertical: str, webhookURL: str, webhookFailoverURL: str, isTMobileRegistered: bool, isTMobileSuspended: bool, isTMobileNumberPoolingEnabled: bool, failureReasons: str, submissionStatus: str, campaignStatus: str, privacyPolicyLink: str, termsAndConditionsLink: str, embeddedLinkSample: str} # Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint PUT /10dlc/campaign/{campaignId}\n@desc Update campaign\n@required {campaignId: str # Unique identifier of the campaign.}\n@optional {resellerId: str # Alphanumeric identifier of the reseller that you want to associate with this campaign., sample1: str # Message sample. Some campaign tiers require 1 or more message samples., sample2: str # Message sample. Some campaign tiers require 2 or more message samples., sample3: str # Message sample. Some campaign tiers require 3 or more message samples., sample4: str # Message sample. Some campaign tiers require 4 or more message samples., sample5: str # Message sample. Some campaign tiers require 5 or more message samples., messageFlow: str # Message flow description., helpMessage: str # Help message of the campaign., autoRenewal: bool=true # Help message of the campaign., webhookURL: str # Webhook to which campaign status updates are sent., webhookFailoverURL: str # Webhook failover to which campaign status updates are sent.}\n@returns(200) {ageGated: bool, autoRenewal: bool, billedDate: str, brandId: str, brandDisplayName: str, campaignId: str, tcrBrandId: str, tcrCampaignId: str, createDate: str, cspId: str, description: str, directLending: bool, embeddedLink: bool, embeddedPhone: bool, helpKeywords: str, helpMessage: str, messageFlow: str, mock: bool, nextRenewalOrExpirationDate: str, numberPool: bool, optinKeywords: str, optinMessage: str, optoutKeywords: str, optoutMessage: str, referenceId: str, resellerId: str, sample1: str, sample2: str, sample3: str, sample4: str, sample5: str, status: str, subUsecases: [str], subscriberHelp: bool, subscriberOptin: bool, subscriberOptout: bool, termsAndConditions: bool, usecase: str, vertical: str, webhookURL: str, webhookFailoverURL: str, isTMobileRegistered: bool, isTMobileSuspended: bool, isTMobileNumberPoolingEnabled: bool, failureReasons: str, submissionStatus: str, campaignStatus: str, privacyPolicyLink: str, termsAndConditionsLink: str, embeddedLinkSample: str} # Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n@example_request {\"resellerId\":\"RESELLER\",\"sample1\":\"Sample1\",\"sample2\":\"Sample2\",\"sample3\":\"Sample3\",\"sample4\":\"Sample4\",\"sample5\":\"Sample5\",\"messageFlow\":\"Messageflow\",\"helpMessage\":\"Helpmessage\",\"autoRenewal\":true,\"webhookURL\":\"WebhookURL\",\"webhookFailoverURL\":\"WebhookURL\"}\n\n@endpoint POST /10dlc/campaign/{campaignId}/appeal\n@desc Submit campaign appeal for manual review\n@required {campaignId: str(uuid) # The Telnyx campaign identifier, appeal_reason: str # Detailed explanation of why the campaign should be reconsidered and what changes have been made to address the rejection reason.}\n@returns(200) {appealed_at: str(date-time)} # Appeal recorded successfully. Campaign status updated to TCR_ACCEPTED for manual compliance review.\n@errors {400: Campaign not in appealable status or invalid request, 404: Campaign not found, 422: Validation Error, 4XX: Generic response error}\n\n@endpoint GET /10dlc/campaign/{campaignId}/mnoMetadata\n@desc Get Campaign Mno Metadata\n@required {campaignId: str # ID of the campaign in question}\n@returns(200) {10999: map{qualify: bool, mno: str, noEmbeddedLink: bool, reqSubscriberHelp: bool, reqSubscriberOptout: bool, mnoReview: bool, noEmbeddedPhone: bool, mnoSupport: bool, reqSubscriberOptin: bool, minMsgSamples: int}} # Successful Response. It constains a map of usecase metadata for each MNO. The key is the network ID of the MNO (e.g. 10017), the value is the mno metadata for the usecase. The metadata may also include some MNO specific fields.\n@errors {4XX: Generic response error, 5XX: Unexpected Error}\n\n@endpoint GET /10dlc/campaign/{campaignId}/operationStatus\n@desc Get campaign operation status\n@required {campaignId: str # Unique identifier of the campaign.}\n@returns(200) Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint GET /10dlc/campaign/{campaignId}/osr/attributes\n@desc Get OSR campaign attributes\n@required {campaignId: str # Unique identifier of the campaign.}\n@returns(200) Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint GET /10dlc/campaign/{campaignId}/osr_attributes\n@desc Get OSR campaign attributes\n@required {campaignId: str # Unique identifier of the campaign.}\n@returns(200) Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint GET /10dlc/campaign/{campaignId}/sharing\n@desc Get Sharing Status\n@required {campaignId: str # ID of the campaign in question}\n@returns(200) {sharedByMe: map{downstreamCnpId: str, sharedDate: str, sharingStatus: str, statusDate: str, upstreamCnpId: str}, sharedWithMe: map{downstreamCnpId: str, sharedDate: str, sharingStatus: str, statusDate: str, upstreamCnpId: str}} # Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint POST /10dlc/campaignBuilder\n@desc Submit Campaign\n@required {brandId: str # Alphanumeric identifier of the brand associated with this campaign., description: str # Summary description of this campaign., usecase: str # Campaign usecase. Must be of defined valid types. Use `/10dlc/enum/usecase` operation to retrieve usecases available for given brand.}\n@optional {ageGated: bool # Age gated message content in campaign., autoRenewal: bool # Campaign subscription auto-renewal option. If set to true, then campaign will automatically renewal at end of billing cycle., directLending: bool # Direct lending or loan arrangement, embeddedLink: bool # Does message generated by the campaign include URL link in SMS?, embeddedPhone: bool # Does message generated by the campaign include phone number in SMS?, helpKeywords: str # Subscriber help keywords. Multiple keywords are comma separated without space., helpMessage: str # Help message of the campaign., messageFlow: str # Message flow description., mnoIds: [int] # Submit campaign to given list of MNOs by MNO's network ID. Default is all MNOs if no value provided., numberPool: bool # Does campaign utilize pool of phone numbers?, optinKeywords: str # Subscriber opt-in keywords. Multiple keywords are comma separated without space., optinMessage: str # Subscriber opt-in message., optoutKeywords: str # Subscriber opt-out keywords. Multiple keywords are comma separated without space., optoutMessage: str # Subscriber opt-out message., referenceId: str # Caller supplied campaign reference ID. If supplied, the value must be unique across all submitted campaigns. Can be used to prevent duplicate campaign registrations., resellerId: str # Alphanumeric identifier of the reseller that you want to associate with this campaign., sample1: str # Message sample. Some campaign tiers require 1 or more message samples., sample2: str # Message sample. Some campaign tiers require 2 or more message samples., sample3: str # Message sample. Some campaign tiers require 3 or more message samples., sample4: str # Message sample. Some campaign tiers require 4 or more message samples., sample5: str # Message sample. Some campaign tiers require 5 or more message samples., subUsecases: [str] # Campaign sub-usecases. Must be of defined valid sub-usecase types. Use `/10dlc/enum/usecase` operation to retrieve list of valid sub-usecases, subscriberHelp: bool # Does campaign responds to help keyword(s)?, subscriberOptin: bool # Does campaign require subscriber to opt-in before SMS is sent to subscriber?, subscriberOptout: bool # Does campaign support subscriber opt-out keyword(s)?, tag: [str] # Tags to be set on the Campaign., termsAndConditions: bool # Is terms and conditions accepted?, privacyPolicyLink: str # Link to the campaign's privacy policy., termsAndConditionsLink: str # Link to the campaign's terms and conditions., embeddedLinkSample: str # Sample of an embedded link that will be sent to subscribers., webhookURL: str # Webhook to which campaign status updates are sent., webhookFailoverURL: str # Failover webhook to which campaign status updates are sent.}\n@returns(200) {ageGated: bool, autoRenewal: bool, billedDate: str, brandId: str, brandDisplayName: str, campaignId: str, tcrBrandId: str, tcrCampaignId: str, createDate: str, cspId: str, description: str, directLending: bool, embeddedLink: bool, embeddedPhone: bool, helpKeywords: str, helpMessage: str, messageFlow: str, mock: bool, nextRenewalOrExpirationDate: str, numberPool: bool, optinKeywords: str, optinMessage: str, optoutKeywords: str, optoutMessage: str, referenceId: str, resellerId: str, sample1: str, sample2: str, sample3: str, sample4: str, sample5: str, status: str, subUsecases: [str], subscriberHelp: bool, subscriberOptin: bool, subscriberOptout: bool, termsAndConditions: bool, usecase: str, vertical: str, webhookURL: str, webhookFailoverURL: str, isTMobileRegistered: bool, isTMobileSuspended: bool, isTMobileNumberPoolingEnabled: bool, failureReasons: str, submissionStatus: str, campaignStatus: str, privacyPolicyLink: str, termsAndConditionsLink: str, embeddedLinkSample: str} # Successful Response\n@errors {400: Bad Request, 402: Insufficient Funds, 422: Validation Error, 4XX: Generic response error}\n\n@endpoint GET /10dlc/campaignBuilder/brand/{brandId}/usecase/{usecase}\n@desc Qualify By Usecase\n@required {usecase: str # Unique identifier of the usecase., brandId: str # Unique identifier of the brand.}\n@returns(200) {annualFee: num, maxSubUsecases: int, minSubUsecases: int, mnoMetadata: map, monthlyFee: num, quarterlyFee: num, usecase: str} # Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint GET /10dlc/enum/{endpoint}\n@desc Get Enum\n@required {endpoint: str(mno/optionalAttributes/usecase/vertical/altBusinessIdType/brandIdentityStatus/brandRelationship/campaignStatus/entityType/extVettingProvider/vettingStatus/brandStatus/operationStatus/approvedPublicCompany/stockExchange/vettingClass) # Unique identifier of the endpoint.}\n@returns(200) Successful Response\n@errors {404: Resource not found, 4XX: Generic response error}\n\n@endpoint GET /10dlc/partnerCampaign/sharedByMe\n@desc List shared partner campaigns\n@optional {page: int=1 # The 1-indexed page number to get. The default value is `1`., recordsPerPage: int=10 # The amount of records per page, limited to between 1 and 500 inclusive. The default value is `10`.}\n@returns(200) {page: int, records: [map], totalRecords: int} # Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint GET /10dlc/partnerCampaign/{campaignId}/sharing\n@desc Get Sharing Status\n@required {campaignId: str # ID of the campaign in question}\n@returns(200) Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint GET /10dlc/partner_campaigns\n@desc List Shared Campaigns\n@optional {page: int=1 # The 1-indexed page number to get. The default value is `1`., recordsPerPage: int=10 # The amount of records per page, limited to between 1 and 500 inclusive. The default value is `10`., sort: str(assignedPhoneNumbersCount/-assignedPhoneNumbersCount/brandDisplayName/-brandDisplayName/tcrBrandId/-tcrBrandId/tcrCampaignId/-tcrCampaignId/createdAt/-createdAt/campaignStatus/-campaignStatus)=-createdAt # Specifies the sort order for results. If not given, results are sorted by createdAt in descending order.}\n@returns(200) {records: [map], page: int, totalRecords: int} # Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint GET /10dlc/partner_campaigns/{campaignId}\n@desc Get Single Shared Campaign\n@required {campaignId: str # Unique identifier of the campaign.}\n@returns(200) {ageGated: bool, assignedPhoneNumbersCount: num, brandDisplayName: str, campaignStatus: str, description: str, directLending: bool, embeddedLink: bool, embeddedLinkSample: str, embeddedPhone: bool, failureReasons: str, helpKeywords: str, helpMessage: str, isNumberPoolingEnabled: bool, messageFlow: str, numberPool: bool, optinKeywords: str, optinMessage: str, optoutKeywords: str, optoutMessage: str, privacyPolicyLink: str, usecase: str, sample1: str, sample2: str, sample3: str, sample4: str, sample5: str, subUsecases: [str], subscriberOptin: bool, subscriberOptout: bool, tcrBrandId: str, tcrCampaignId: str, termsAndConditions: bool, termsAndConditionsLink: str, webhookURL: str, webhookFailoverURL: str, createdAt: str, updatedAt: str} # Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint PATCH /10dlc/partner_campaigns/{campaignId}\n@desc Update Single Shared Campaign\n@required {campaignId: str # Unique identifier of the campaign.}\n@optional {webhookURL: str # Webhook to which campaign status updates are sent., webhookFailoverURL: str # Webhook failover to which campaign status updates are sent.}\n@returns(200) {ageGated: bool, assignedPhoneNumbersCount: num, brandDisplayName: str, campaignStatus: str, description: str, directLending: bool, embeddedLink: bool, embeddedLinkSample: str, embeddedPhone: bool, failureReasons: str, helpKeywords: str, helpMessage: str, isNumberPoolingEnabled: bool, messageFlow: str, numberPool: bool, optinKeywords: str, optinMessage: str, optoutKeywords: str, optoutMessage: str, privacyPolicyLink: str, usecase: str, sample1: str, sample2: str, sample3: str, sample4: str, sample5: str, subUsecases: [str], subscriberOptin: bool, subscriberOptout: bool, tcrBrandId: str, tcrCampaignId: str, termsAndConditions: bool, termsAndConditionsLink: str, webhookURL: str, webhookFailoverURL: str, createdAt: str, updatedAt: str} # Successful Response\n@errors {422: Validation Error, 4XX: Generic response error}\n\n@endpoint POST /10dlc/phoneNumberAssignmentByProfile\n@desc Assign Messaging Profile To Campaign\n@required {messagingProfileId: str # The ID of the messaging profile that you want to link to the specified campaign.}\n@optional {tcrCampaignId: str # The TCR ID of the shared campaign you want to link to the specified messaging profile (for campaigns not created using Telnyx 10DLC services only). If you supply this ID in the request, do not also include a campaignId., campaignId: str # The ID of the campaign you want to link to the specified messaging profile. If you supply this ID in the request, do not also include a tcrCampaignId.}\n@returns(202) {messagingProfileId: str, tcrCampaignId: str, campaignId: str, taskId: str} # Successful Response\n@errors {500: Error searching for phone numbers, 4XX: Generic response error}\n\n@endpoint GET /10dlc/phoneNumberAssignmentByProfile/{taskId}\n@desc Get Assignment Task Status\n@required {taskId: str # Unique identifier of the task.}\n@returns(200) {taskId: str, status: str, createdAt: str(date-time), updatedAt: str(date-time)} # Successful Response\n@errors {4XX: Generic response error}\n\n@endpoint GET /10dlc/phoneNumberAssignmentByProfile/{taskId}/phoneNumbers\n@desc Get Phone Number Status\n@required {taskId: str # Unique identifier of the task.}\n@optional {recordsPerPage: int=20 # Number of records to return per page., page: int=1 # Page number to retrieve (1-based).}\n@returns(200) {records: [map]} # Successful Response\n@errors {422: Generic response error, 4XX: Generic response error}\n\n@endpoint GET /10dlc/phone_number_campaigns\n@desc List phone number campaigns\n@optional {recordsPerPage: int=20 # Number of records to return per page., page: int=1 # Page number to retrieve (1-based)., filter: map # Consolidated filter parameter (deepObject style). Originally: filter[telnyx_campaign_id], filter[telnyx_brand_id], filter[tcr_campaign_id], filter[tcr_brand_id], sort: str(assignmentStatus/-assignmentStatus/createdAt/-createdAt/phoneNumber/-phoneNumber)=-createdAt # Specifies the sort order for results. If not given, results are sorted by createdAt in descending order.}\n@returns(200) {records: [map], page: int, totalRecords: int} # Successful Response\n@errors {4XX: Generic response error}\n\n@endpoint POST /10dlc/phone_number_campaigns\n@desc Create New Phone Number Campaign\n@required {phoneNumber: str # The phone number you want to link to a specified campaign., campaignId: str # The ID of the campaign you want to link to the specified phone number.}\n@returns(200) {phoneNumber: str, brandId: str, tcrBrandId: str, campaignId: str, tcrCampaignId: str, telnyxCampaignId: str, assignmentStatus: str, tmobileNumberMappingStatus: str, nonTmobileNumberMappingStatus: str, failureReasons: str, createdAt: str, updatedAt: str} # Successful Response\n@errors {4XX: Generic response error}\n\n@endpoint DELETE /10dlc/phone_number_campaigns/{phoneNumber}\n@desc Delete Phone Number Campaign\n@required {phoneNumber: str # Unique identifier of the phone number.}\n@returns(200) {phoneNumber: str, brandId: str, tcrBrandId: str, campaignId: str, tcrCampaignId: str, telnyxCampaignId: str, assignmentStatus: str, tmobileNumberMappingStatus: str, nonTmobileNumberMappingStatus: str, failureReasons: str, createdAt: str, updatedAt: str} # Successful Response\n@errors {4XX: Generic response error}\n\n@endpoint GET /10dlc/phone_number_campaigns/{phoneNumber}\n@desc Get Single Phone Number Campaign\n@required {phoneNumber: str # Unique identifier of the phone number.}\n@returns(200) {phoneNumber: str, brandId: str, tcrBrandId: str, campaignId: str, tcrCampaignId: str, telnyxCampaignId: str, assignmentStatus: str, tmobileNumberMappingStatus: str, nonTmobileNumberMappingStatus: str, failureReasons: str, createdAt: str, updatedAt: str} # Successful Response\n@errors {4XX: Generic response error}\n\n@endpoint PUT /10dlc/phone_number_campaigns/{phoneNumber}\n@desc Update Phone Number Campaign\n@required {phoneNumber: str # Unique identifier of the phone number., phoneNumber: str # The phone number you want to link to a specified campaign., campaignId: str # The ID of the campaign you want to link to the specified phone number.}\n@returns(200) {phoneNumber: str, brandId: str, tcrBrandId: str, campaignId: str, tcrCampaignId: str, telnyxCampaignId: str, assignmentStatus: str, tmobileNumberMappingStatus: str, nonTmobileNumberMappingStatus: str, failureReasons: str, createdAt: str, updatedAt: str} # Successful Response\n@errors {4XX: Generic response error}\n\n@endgroup\n\n@group access_ip_address\n@endpoint GET /access_ip_address\n@desc List all Access IP Addresses\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[ip_source], filter[ip_address], filter[created_at]. Supports complex bracket operations for dynamic filtering., page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_pages: int, total_results: int}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /access_ip_address\n@desc Create new Access IP Address\n@required {ip_address: str}\n@optional {description: str}\n@returns(200) {id: str, ip_address: str, source: str, status: str, description: str, user_id: str, created_at: str(date-time), updated_at: str(date-time)} # Successful Response\n@errors {422: Validation Error}\n@example_request {\"ip_address\":\"Ip Address\",\"description\":\"Description\"}\n\n@endpoint DELETE /access_ip_address/{access_ip_address_id}\n@desc Delete access IP address\n@required {access_ip_address_id: str # Unique identifier of the access ip address.}\n@returns(200) {id: str, ip_address: str, source: str, status: str, description: str, user_id: str, created_at: str(date-time), updated_at: str(date-time)} # Successful Response\n@errors {404: Resource not found}\n\n@endpoint GET /access_ip_address/{access_ip_address_id}\n@desc Retrieve an access IP address\n@required {access_ip_address_id: str # Unique identifier of the access ip address.}\n@returns(200) {id: str, ip_address: str, source: str, status: str, description: str, user_id: str, created_at: str(date-time), updated_at: str(date-time)} # Successful Response\n@errors {404: Resource not found}\n\n@endgroup\n\n@group access_ip_ranges\n@endpoint GET /access_ip_ranges\n@desc List all Access IP Ranges\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[cidr_block], filter[cidr_block][startswith], filter[cidr_block][endswith], filter[cidr_block][contains], filter[created_at]. Supports complex bracket operations for dynamic filtering., page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_pages: int, total_results: int}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /access_ip_ranges\n@desc Create new Access IP Range\n@required {cidr_block: str}\n@optional {description: str}\n@returns(200) {id: str, cidr_block: str, status: str, description: str, user_id: str, created_at: str(date-time), updated_at: str(date-time)} # Successful Response\n@errors {422: Validation Error}\n@example_request {\"cidr_block\":\"Cidr Block\",\"description\":\"Description\"}\n\n@endpoint DELETE /access_ip_ranges/{access_ip_range_id}\n@desc Delete access IP ranges\n@required {access_ip_range_id: str # Unique identifier of the access ip range.}\n@returns(200) {id: str, cidr_block: str, status: str, description: str, user_id: str, created_at: str(date-time), updated_at: str(date-time)} # Successful Response\n@errors {404: Resource not found}\n\n@endgroup\n\n@group actions\n@endpoint POST /actions/purchase/esims\n@desc Purchase eSIMs\n@required {amount: int # The amount of eSIMs to be purchased.}\n@optional {sim_card_group_id: str(uuid) # The group SIMCardGroup identification. This attribute can be null when it's present in an associated resource., tags: [str] # Searchable tags associated with the SIM cards, product: str # Type of product to be purchased, specify \"whitelabel\" to use a custom SPN, whitelabel_name: str # Service Provider Name (SPN) for the Whitelabel eSIM product. It will be displayed as the mobile service name by operating systems of smartphones. This parameter must only contain letters, numbers and whitespaces., status: str(enabled/disabled/standby)=enabled # Status on which the SIM cards will be set after being successfully registered.}\n@returns(202) {data: [map], errors: [map]} # Successful response\n@errors {401: Unauthorized}\n\n@endpoint POST /actions/register/sim_cards\n@desc Register SIM cards\n@required {registration_codes: [str]}\n@optional {sim_card_group_id: str(uuid) # The group SIMCardGroup identification. This attribute can be null when it's present in an associated resource., tags: [str] # Searchable tags associated with the SIM card, status: str(enabled/disabled/standby)=enabled # Status on which the SIM card will be set after being successful registered.}\n@returns(202) {data: [map], errors: [map]} # Successful response\n@errors {401: Unauthorized}\n\n@endgroup\n\n@group addresses\n@endpoint GET /addresses\n@desc List all addresses\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[customer_reference][eq], filter[customer_reference][contains], filter[used_as_emergency], filter[street_address][contains], filter[address_book][eq], sort: str(created_at/first_name/last_name/business_name/street_address)=created_at # Specifies the sort order for results. By default sorting direction is ascending. To have the results sorted in descending order add the  - prefix. That is:         street_address: sorts the result by the     street_address field in ascending order.            -street_address: sorts the result by the     street_address field in descending order.      If not given, results are sorted by created_at in descending order.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {400: Bad request, 401: Unauthorized, 404: Resource not found}\n\n@endpoint POST /addresses\n@desc Creates an address\n@required {first_name: str # The first name associated with the address. An address must have either a first last name or a business name., last_name: str # The last name associated with the address. An address must have either a first last name or a business name., business_name: str # The business name associated with the address. An address must have either a first last name or a business name., street_address: str # The primary street address information about the address., locality: str # The locality of the address. For US addresses, this corresponds to the city of the address., country_code: str # The two-character (ISO 3166-1 alpha-2) country code of the address.}\n@optional {customer_reference: str # A customer reference string for customer look ups., phone_number: str # The phone number associated with the address., extended_address: str # Additional street address information about the address such as, but not limited to, unit number or apartment number., administrative_area: str # The locality of the address. For US addresses, this corresponds to the state of the address., neighborhood: str # The neighborhood of the address. This field is not used for addresses in the US but is used for some international addresses., borough: str # The borough of the address. This field is not used for addresses in the US but is used for some international addresses., postal_code: str # The postal code of the address., address_book: bool=true # Indicates whether or not the address should be considered part of your list of addresses that appear for regular use., validate_address: bool=true # Indicates whether or not the address should be validated for emergency use upon creation or not. This should be left with the default value of `true` unless you have used the `/addresses/actions/validate` endpoint to validate the address separately prior to creation. If an address is not validated for emergency use upon creation and it is not valid, it will not be able to be used for emergency services.}\n@returns(200) {data: map{id: str, record_type: str, customer_reference: str, first_name: str, last_name: str, business_name: str, phone_number: str, street_address: str, extended_address: str, locality: str, administrative_area: str, neighborhood: str, borough: str, postal_code: str, country_code: str, address_book: bool, validate_address: bool, created_at: str, updated_at: str}} # Successful response\n@errors {422: Bad request}\n\n@endpoint POST /addresses/actions/validate\n@desc Validate an address\n@required {street_address: str # The primary street address information about the address., postal_code: str # The postal code of the address., country_code: str # The two-character (ISO 3166-1 alpha-2) country code of the address.}\n@optional {extended_address: str # Additional street address information about the address such as, but not limited to, unit number or apartment number., locality: str # The locality of the address. For US addresses, this corresponds to the city of the address., administrative_area: str # The locality of the address. For US addresses, this corresponds to the state of the address.}\n@returns(200) {data: map{result: str, suggested: map{street_address: str, extended_address: str, locality: str, administrative_area: str, postal_code: str, country_code: str}, record_type: str, errors: [map]}} # Action response\n@errors {422: Bad request}\n\n@endpoint DELETE /addresses/{id}\n@desc Deletes an address\n@required {id: str # address ID}\n@returns(200) {data: map{id: str, record_type: str, customer_reference: str, first_name: str, last_name: str, business_name: str, phone_number: str, street_address: str, extended_address: str, locality: str, administrative_area: str, neighborhood: str, borough: str, postal_code: str, country_code: str, address_book: bool, validate_address: bool, created_at: str, updated_at: str}} # Successful response\n@errors {401: Unauthorized, 404: Resource not found, 422: Bad request}\n\n@endpoint GET /addresses/{id}\n@desc Retrieve an address\n@required {id: str # address ID}\n@returns(200) {data: map{id: str, record_type: str, customer_reference: str, first_name: str, last_name: str, business_name: str, phone_number: str, street_address: str, extended_address: str, locality: str, administrative_area: str, neighborhood: str, borough: str, postal_code: str, country_code: str, address_book: bool, validate_address: bool, created_at: str, updated_at: str}} # Successful response\n@errors {401: Unauthorized, 404: Resource not found, 422: Bad request}\n\n@endpoint POST /addresses/{id}/actions/accept_suggestions\n@desc Accepts this address suggestion as a new emergency address for Operator Connect and finishes the uploads of the numbers associated with it to Microsoft.\n@required {id: str(uuid) # The UUID of the address that should be accepted.}\n@optional {id: str # The ID of the address.}\n@returns(200) {data: map{accepted: bool, id: str(uuid), record_type: str}} # This address suggestion has already been accepted.\n@returns(202) {data: map{accepted: bool, id: str(uuid), record_type: str}} # This address suggestion was accepted. The numbers associated to it will resume processing in the background.\n@errors {404: Address not found or not accessible by the user.}\n@example_request {\"id\":\"string\"}\n\n@endgroup\n\n@group advanced_orders\n@endpoint GET /advanced_orders\n@desc List Advanced Orders\n@returns(200) {data: [map]} # An array of Advanced Order Responses\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint POST /advanced_orders\n@desc Create Advanced Order\n@optional {country_code: str=US, comments: str=, quantity: int=1, area_code: str=, phone_number_type: str(local/mobile/toll_free/shared_cost/national/landline)=local, features: [any], customer_reference: str=, requirement_group_id: str(uuid) # The ID of the requirement group to associate with this advanced order}\n@returns(200) {country_code: str, comments: str, quantity: int, area_code: str, phone_number_type: any, features: [any], customer_reference: str, id: str(uuid), status: any, orders: [str(uuid)], requirement_group_id: str(uuid)} # An Advanced Order Response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint PATCH /advanced_orders/{advanced-order-id}/requirement_group\n@desc Update Advanced Order\n@required {advanced-order-id: str(uuid) # Unique identifier of the advanced order.}\n@optional {country_code: str=US, comments: str=, quantity: int=1, area_code: str=, phone_number_type: str(local/mobile/toll_free/shared_cost/national/landline)=local, features: [any], customer_reference: str=, requirement_group_id: str(uuid) # The ID of the requirement group to associate with this advanced order}\n@returns(200) {country_code: str, comments: str, quantity: int, area_code: str, phone_number_type: any, features: [any], customer_reference: str, id: str(uuid), status: any, orders: [str(uuid)], requirement_group_id: str(uuid)} # An Advanced Order Response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /advanced_orders/{order_id}\n@desc Get Advanced Order\n@required {order_id: str(uuid) # Unique identifier of the order.}\n@returns(200) {country_code: str, comments: str, quantity: int, area_code: str, phone_number_type: any, features: [any], customer_reference: str, id: str(uuid), status: any, orders: [str(uuid)], requirement_group_id: str(uuid)} # An Advanced Order Response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group ai\n@endpoint POST /ai/anthropic/v1/messages\n@desc Create a message (Anthropic-compatible)\n@required {model: str # The model to use for generating the response, for example `zai-org/GLM-5.3-Flash` or another model available from the Telnyx models endpoint., messages: [map] # The messages to send to the model, following the [Anthropic Messages API](https://docs.anthropic.com/en/api/messages) format., max_tokens: int # The maximum number of tokens to generate in the response.}\n@optional {system: any # System prompt. Can be a string or an array of content blocks following the Anthropic API format., stream: bool=false # Whether to stream the response as Anthropic-format Server-Sent Events., temperature: num # Amount of randomness injected into the response. Ranges from 0 to 1., top_p: num # Nucleus sampling parameter. Use temperature or top_p, but not both., top_k: int # Top-k sampling parameter. Only sample from the top K options for each subsequent token., stop_sequences: [str] # Custom sequences that will cause the model to stop generating., metadata: map # An object describing metadata about the request., tools: [map] # Definitions of tools that the model may use, following the Anthropic API format., tool_choice: map # Controls how the model uses tools, following the Anthropic API format., thinking: map # Extended thinking configuration for models that support it. Set `type` to `enabled` to turn on extended thinking., api_key_ref: str # If you are using an external inference provider, this field allows you to pass along a reference to your API key. After creating an [integration secret](https://developers.telnyx.com/api-reference/integration-secrets/create-a-secret) for your API key, pass the secret's `identifier` in this field., mcp_servers: [map] # List of MCP (Model Context Protocol) servers to make available to the model., fallback_config: map # Configuration for model fallback behavior when the primary model is unavailable., billing_group_id: str(uuid) # The billing group ID to associate with this request., timeout: num=300 # Request timeout in seconds., max_retries: int # Maximum number of retries for the request., service_tier: str # The service tier to use for this request. Supported values vary by model; use the Telnyx models endpoint and inspect the model's `service_tiers` field. If omitted, Telnyx-hosted models use `default`., region: str(USA/EU/AUS/UAE) # Optional data-residency region the request should be served from, using the same vocabulary as your account's Data Locality setting. Behavior depends on `mode`. Supported for Telnyx-hosted models only: a request routed to an external provider never passes through Telnyx model routing, so a region cannot be enforced for it. Omit for today's latency-based routing., mode: str(preferred/strict)=preferred # How strictly `region` is applied. `preferred` (the default when `region` is set) tries that region first and falls back to another when the model cannot be served there, so a request that would have succeeded still succeeds. `strict` pins the request: it is served from that region or it fails with a 422, never redirected to another region. Requires `region`.}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n@example_request {\"model\":\"zai-org/GLM-5.3-Flash\",\"system\":\"You are a friendly chatbot.\",\"messages\":[{\"role\":\"user\",\"content\":\"Hello, world!\"}],\"max_tokens\":1024}\n\n@endpoint GET /ai/assistants\n@desc List assistants\n@returns(200) {data: [map]} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/assistants\n@desc Create an assistant\n@required {name: str, instructions: str # System instructions for the assistant. These may be templated with [dynamic variables](https://developers.telnyx.com/docs/inference/ai-assistants/dynamic-variables)}\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key., model: str # ID of the model to use when `external_llm` is not set. You can use the [Get models API](https://developers.telnyx.com/api-reference/openai-chat/get-available-models-openai-compatible) to see available models. If `external_llm` is provided, the assistant uses `external_llm` instead of this field. If neither `model` nor `external_llm` is provided, Telnyx applies the default model., tools: [any] # Deprecated for new integrations. Inline tool definitions available to the assistant. Prefer `tool_ids` to attach shared tools created with the AI Tools endpoints. On update, a sent `tools` array fully replaces the assistant's inline tools; omit the field to leave them unchanged. Each tool type except `function`, `webhook`, and `client_side_tool` allows at most one instance per assistant, counted across inline `tools` and shared `tool_ids` combined., mcp_servers: [map{id!: str, allowed_tools: [str]}]= # MCP servers attached to the assistant. Create MCP servers with `/ai/mcp_servers`, then reference them by `id` here., a2a_agents: [map{name!: str, url!: str, headers: [map], async: bool, timeout_ms: int, poll_interval_ms: int, messages: [any]}]= # A2A agents this assistant can delegate to. Tools are not stored here: at the start of every conversation each agent's card is fetched and one tool is derived per skill the card advertises, named `a2a__`. The following limits are not enforced when the assistant is saved, and anything past them is dropped when the conversation starts: 64 agents per assistant, 64 skills per card, 128 derived tools per assistant, and a 6 second budget for all card fetches combined. An agent whose card cannot be fetched costs the assistant that capability for the conversation; it does not fail the call., tool_ids: [str] # IDs of shared tools to attach to the assistant. New integrations should prefer `tool_ids` over inline `tools`., description: str, greeting: str # Text that the assistant will use to start the conversation. This may be templated with [dynamic variables](https://developers.telnyx.com/docs/inference/ai-assistants/dynamic-variables). Use an empty string to have the assistant wait for the user to speak first. Use the special value `` to have the assistant generate the greeting based on the system instructions., llm_api_key_ref: str # This is only needed when using third-party inference providers selected by `model`. The `identifier` for an integration secret [/v2/integration_secrets](https://developers.telnyx.com/api-reference/integration-secrets/create-a-secret) that refers to your LLM provider's API key. For bring-your-own endpoint authentication, use `external_llm.llm_api_key_ref` instead. Warning: Free plans are unlikely to work with this integration., external_llm: map{model!: str, base_url!: str, llm_api_key_ref: str, authentication_method: str, certificate_ref: str, token_retrieval_url: str, forward_metadata: bool}, fallback_config: map{model: str, llm_api_key_ref: str, external_llm: map}, voice_settings: map{voice!: str, voice_speed: num, api_key_ref: str, temperature: num, similarity_boost: num, use_speaker_boost: bool, style: num, speed: num, language_boost: str, expressive_mode: bool, background_audio: any}, transcription: map{model: str, language: str, api_key_ref: str, region: str, settings: map}, telephony_settings: map{default_texml_app_id: str, supports_unauthenticated_web_calls: bool, noise_suppression: str, noise_suppression_config: map, time_limit_secs: int, user_idle_timeout_secs: int, user_idle_reply_secs: int, fallback_destination: str, send_message_history_updates: bool, voicemail_detection: map, disable_dtmf: bool, recording_settings: map}, messaging_settings: map{default_messaging_profile_id: str, delivery_status_webhook_url: str, conversation_inactivity_minutes: int}, enabled_features: [str], insight_settings: map{insight_group_id: str}, privacy_settings: map{data_retention: bool, in_transit_data_locality: bool}, dynamic_variables_webhook_url: str # If `dynamic_variables_webhook_url` is set, Telnyx sends a POST request to this URL at the start of the conversation to resolve dynamic variables. **Gotcha:** the webhook response must wrap variables under a top-level `dynamic_variables` object, e.g. `{\"dynamic_variables\": {\"customer_name\": \"Jane\"}}`. Returning a flat object will be ignored and variables will fall back to their defaults. See the [dynamic variables guide](https://developers.telnyx.com/docs/inference/ai-assistants/dynamic-variables) for the full request/response format and timeout behavior., dynamic_variables_webhook_timeout_ms: int=1500 # Timeout in milliseconds for the dynamic variables webhook. Must be between 1 and 10000 ms. If the webhook does not respond within this timeout, the call proceeds with default values. See the [dynamic variables guide](https://developers.telnyx.com/docs/inference/ai-assistants/dynamic-variables)., dynamic_variables: map # Map of dynamic variables and their default values, widget_settings: map{theme: str, audio_visualizer_config: map, start_call_text: str, default_state: str, position: str, view_history_url: str, report_issue_url: str, give_feedback_url: str, agent_thinking_text: str, speak_to_interrupt_text: str, logo_icon_url: str} # Configuration settings for the assistant's web widget., interruption_settings: map{enable: bool, disable_greeting_interruption: bool, start_speaking_plan: map, interrupt_prediction_threshold: num} # Settings for interruptions and how the assistant decides the user has finished speaking. These timings are most relevant when using non turn-taking transcription models. For turn-taking models like `deepgram/flux`, end-of-turn behavior is controlled by the transcription end-of-turn settings under `transcription.settings` (`eot_threshold`, `eot_timeout_ms`, `eager_eot_threshold`)., integrations: [map{integration_id!: str, allowed_list: [str]}]= # Connected integrations attached to the assistant. The catalog of available integrations is at `/ai/integrations`; the user's connected integrations are at `/ai/integrations/connections`. Each item references a catalog integration by `integration_id`., observability_settings: map{status: str, secret_key_ref: str, public_key_ref: str, host: str, prompt_name: str, prompt_version: int, prompt_label: str, prompt_sync: str}, tags: [str]= # Tags associated with the assistant. Tags can also be managed with the assistant tag endpoints., post_conversation_settings: map{enabled: bool} # Configuration for post-conversation processing. When enabled, the assistant receives one additional LLM turn after the conversation ends, allowing it to execute final tool calls such as sending a summary or updating a record via webhook or function tools. Integration and MCP server tools are not available post-conversation; call-control tools (e.g. hangup, transfer) are also unavailable. Beta feature., conversation_flow: map{edges: [map], nodes!: [any], start_node_id!: str} # Conversation flow as supplied by API clients (create / update).  A directed graph of `FlowNodeReq` connected by `FlowEdge`s. Validation enforces unique node/edge IDs, that `start_node_id` references a real node, and that every edge's endpoints reference real nodes.}\n@returns(200) {id: str, name: str, created_at: str(date-time), version_id: str, version_created_at: str(date-time), description: str, model: str, instructions: str, tools: [any], mcp_servers: [map], a2a_agents: [map], greeting: str, llm_api_key_ref: str, external_llm: map{model: str, base_url: str, llm_api_key_ref: str, authentication_method: str, certificate_ref: str, token_retrieval_url: str, forward_metadata: bool}, fallback_config: map{model: str, llm_api_key_ref: str, external_llm: map{model: str, base_url: str, llm_api_key_ref: str, authentication_method: str, certificate_ref: str, token_retrieval_url: str, forward_metadata: bool}}, voice_settings: map{voice: str, voice_speed: num, api_key_ref: str, temperature: num, similarity_boost: num, use_speaker_boost: bool, style: num, speed: num, language_boost: str?, expressive_mode: bool, background_audio: any}, transcription: map{model: str, language: str, api_key_ref: str, region: str, settings: map{smart_format: bool, numerals: bool, eot_threshold: num, eot_timeout_ms: int, eager_eot_threshold: num, keyterm: str, end_of_turn_confidence_threshold: num, min_turn_silence: int, max_turn_silence: int, interim_results: bool, enable_endpoint_detection: bool, max_endpoint_delay_ms: int, context: str, language_hints: [str]}}, telephony_settings: map{default_texml_app_id: str, supports_unauthenticated_web_calls: bool, noise_suppression: str, noise_suppression_config: map{attenuation_limit: int, mode: str, family: str, size: str, enhancement_level: num}, time_limit_secs: int, user_idle_timeout_secs: int, user_idle_reply_secs: int, fallback_destination: str, send_message_history_updates: bool, voicemail_detection: map{on_voicemail_detected: map{action: str, voicemail_message: map}}, disable_dtmf: bool, recording_settings: map{enabled: bool, channels: str, format: str, stop_on_conversation_end: bool}}, messaging_settings: map{default_messaging_profile_id: str, delivery_status_webhook_url: str, conversation_inactivity_minutes: int}, enabled_features: [str], insight_settings: map{insight_group_id: str}, privacy_settings: map{data_retention: bool, in_transit_data_locality: bool}, dynamic_variables_webhook_url: str, dynamic_variables_webhook_timeout_ms: int, dynamic_variables: map, import_metadata: map{import_provider: str, import_id: str}, widget_settings: map{theme: str, audio_visualizer_config: map{color: str, preset: str}, start_call_text: str, default_state: str, position: str, view_history_url: str?, report_issue_url: str?, give_feedback_url: str?, agent_thinking_text: str, speak_to_interrupt_text: str, logo_icon_url: str?}, interruption_settings: map{enable: bool, disable_greeting_interruption: bool, start_speaking_plan: map{wait_seconds: num(float), transcription_endpointing_plan: map{on_punctuation_seconds: num(float), on_no_punctuation_seconds: num(float), on_number_seconds: num(float)}}, interrupt_prediction_threshold: num?}, integrations: [map], observability_settings: map{status: str, secret_key_ref: str, public_key_ref: str, host: str, prompt_name: str, prompt_version: int, prompt_label: str, prompt_sync: str}, version_name: str, related_mission_ids: [str], tags: [str], post_conversation_settings: map{enabled: bool}, conversation_flow: map{edges: [map], nodes: [any], start_node_id: str}} # Successful Response\n@errors {400: Bad Request / Validation Failed (10015). Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015. The assistant configuration is validated too: enabling `privacy_settings.in_transit_data_locality` is refused when the organization's data-locality region has no in-region inference, or when any model the assistant could use — its `model`, its `fallback_config`, or a conversation-flow node override — is not Telnyx-hosted., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Payload Too Large. A request sent with an Idempotency-Key whose body exceeds the endpoint's Edge replay-protection limit (256 KB) is rejected before it reaches the service. Requests sent without the header are not subject to this limit., 422: Validation Error. Reusing an Idempotency-Key with a different request body also returns 422 with error code 10027., 503: Service unavailable (10016), including unavailable Edge idempotency protection for a keyed request.}\n\n@endpoint POST /ai/assistants/import\n@desc Import assistants from external provider\n@required {provider: str(elevenlabs/vapi/retell) # The external provider to import assistants from., api_key_ref: str # Integration secret pointer that refers to the API key for the external provider. This should be an identifier for an integration secret created via /v2/integration_secrets.}\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key., import_ids: [str] # Optional list of assistant IDs to import from the external provider. If not provided, all assistants will be imported.}\n@returns(200) {data: [map]} # Successful Response\n@errors {400: Bad Request / Validation Failed (10015). Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Payload Too Large. A request sent with an Idempotency-Key whose body exceeds the endpoint's Edge replay-protection limit (256 KB) is rejected before it reaches the service. Requests sent without the header are not subject to this limit., 422: Validation Error. Reusing an Idempotency-Key with a different request body also returns 422 with error code 10027., 503: Service unavailable (10016), including unavailable Edge idempotency protection for a keyed request.}\n@example_request {\"provider\":\"elevenlabs\",\"api_key_ref\":\"string\",\"import_ids\":[\"string\"]}\n\n@endpoint GET /ai/assistants/tags\n@desc Get All Tags\n@returns(200) {tags: [str]} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/assistants/tests\n@desc List assistant tests with pagination\n@optional {test_suite: str # Filter tests by test suite name, telnyx_conversation_channel: str # Filter tests by communication channel (e.g., 'web_chat', 'sms'), destination: str # Filter tests by destination (phone number, webhook URL, etc.), page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {meta: any, data: [map]} # Returns paginated test list with metadata for navigation and filtering\n@errors {422: Validation Error}\n\n@endpoint POST /ai/assistants/tests\n@desc Create a new assistant test\n@required {name: str # A descriptive name for the assistant test. This will be used to identify the test in the UI and reports., destination: str # The target destination for the test conversation. Format depends on the channel: phone number for SMS/voice, webhook URL for web chat, etc., instructions: str # Detailed instructions that define the test scenario and what the assistant should accomplish. This guides the test execution and evaluation., rubric: [map{name!: str, criteria!: str}] # Evaluation criteria used to assess the assistant's performance. Each rubric item contains a name and specific criteria for evaluation.}\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key., description: str # Optional detailed description of what this test evaluates and its purpose. Helps team members understand the test's objectives., telnyx_conversation_channel: any=web_chat # The communication channel through which the test will be conducted. Determines how the assistant will receive and respond to test messages., max_duration_seconds: int # Maximum duration in seconds that the test conversation should run before timing out. If not specified, uses system default timeout., test_suite: str # Optional test suite name to group related tests together. Useful for organizing tests by feature, team, or release cycle.}\n@returns(201) {test_id: str(uuid), name: str, description: str, telnyx_conversation_channel: any, destination: str, max_duration_seconds: int, test_suite: str, instructions: str, rubric: [map], created_at: str(date-time)} # Returns the created test configuration with assigned test ID\n@errors {400: Bad Request / Validation Failed (10015). Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Payload Too Large. A request sent with an Idempotency-Key whose body exceeds the endpoint's Edge replay-protection limit (256 KB) is rejected before it reaches the service. Requests sent without the header are not subject to this limit., 422: Validation Error. Reusing an Idempotency-Key with a different request body also returns 422 with error code 10027., 503: Service unavailable (10016), including unavailable Edge idempotency protection for a keyed request.}\n\n@endpoint GET /ai/assistants/tests/test-suites\n@desc Get all test suite names\n@returns(200) {data: [str]} # Returns an array of unique test suite names for filtering and organization\n@errors {422: Validation Error}\n\n@endpoint GET /ai/assistants/tests/test-suites/{suite_name}/runs\n@desc Get test suite run history\n@required {suite_name: str # Name of the suite.}\n@optional {status: str # Filter runs by execution status (pending, running, completed, failed, timeout), test_suite_run_id: str # Filter runs by specific suite execution batch ID, page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}, data: [map]} # Returns paginated list of test runs within the specified suite\n@errors {422: Validation Error}\n\n@endpoint POST /ai/assistants/tests/test-suites/{suite_name}/runs\n@desc Trigger test suite execution\n@required {suite_name: str # Name of the suite.}\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key., destination_version_id: str # Optional assistant version ID to use for all test runs in this suite. If provided, the version must exist or a 400 error will be returned. If not provided, test will run on main version}\n@returns(201) Returns array of created test runs for all tests in the suite\n@errors {400: Bad Request / Validation Failed (10015). Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Payload Too Large. A request sent with an Idempotency-Key whose body exceeds the endpoint's Edge replay-protection limit (256 KB) is rejected before it reaches the service. Requests sent without the header are not subject to this limit., 422: Validation Error. Reusing an Idempotency-Key with a different request body also returns 422 with error code 10027., 503: Service unavailable (10016), including unavailable Edge idempotency protection for a keyed request.}\n\n@endpoint DELETE /ai/assistants/tests/{test_id}\n@desc Delete an assistant test\n@required {test_id: str # Unique identifier of the test.}\n@returns(200) Returns success status when test is successfully deleted\n@errors {422: Validation Error}\n\n@endpoint GET /ai/assistants/tests/{test_id}\n@desc Get assistant test by ID\n@required {test_id: str # Unique identifier of the test.}\n@returns(200) {test_id: str(uuid), name: str, description: str, telnyx_conversation_channel: any, destination: str, max_duration_seconds: int, test_suite: str, instructions: str, rubric: [map], created_at: str(date-time)} # Returns complete test configuration including rubric, schedule, and metadata\n@errors {422: Validation Error}\n\n@endpoint PUT /ai/assistants/tests/{test_id}\n@desc Update an assistant test\n@required {test_id: str # Unique identifier of the test.}\n@optional {name: str # Updated name for the assistant test. Must be unique and descriptive., description: str # Updated description of the test's purpose and evaluation criteria., telnyx_conversation_channel: str(phone_call/web_call/sms_chat/web_chat), destination: str # Updated target destination for test conversations., max_duration_seconds: int # Updated maximum test duration in seconds., test_suite: str # Updated test suite assignment for better organization., instructions: str # Updated test scenario instructions and objectives., rubric: [map{name!: str, criteria!: str}] # Updated evaluation criteria for assessing assistant performance.}\n@returns(200) {test_id: str(uuid), name: str, description: str, telnyx_conversation_channel: any, destination: str, max_duration_seconds: int, test_suite: str, instructions: str, rubric: [map], created_at: str(date-time)} # Returns the updated test configuration with all changes applied\n@errors {422: Validation Error}\n@example_request {\"name\":\"Name\",\"description\":\"Description\",\"telnyx_conversation_channel\":\"phone_call\",\"destination\":\"Destination\",\"max_duration_seconds\":30,\"test_suite\":\"Test Suite\",\"instructions\":\"Instructions\",\"rubric\":[{\"name\":\"string\",\"criteria\":\"string\"}]}\n\n@endpoint GET /ai/assistants/tests/{test_id}/runs\n@desc Get test run history for a specific test\n@required {test_id: str # Unique identifier of the test.}\n@optional {status: str # Filter runs by execution status (pending, running, completed, failed, timeout), page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}, data: [map]} # Returns paginated list of test runs for the specified test\n@errors {422: Validation Error}\n\n@endpoint POST /ai/assistants/tests/{test_id}/runs\n@desc Trigger a manual test run\n@required {test_id: str # Unique identifier of the test.}\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key., destination_version_id: str # Optional assistant version ID to use for this test run. If provided, the version must exist or a 400 error will be returned. If not provided, test will run on main version}\n@returns(201) {run_id: str(uuid), test_id: str(uuid), status: str, triggered_by: str, completed_at: str(date-time), logs: str, conversation_id: str, conversation_insights_id: str, test_suite_run_id: str(uuid), created_at: str(date-time), updated_at: str(date-time), detail_status: [map]} # Returns the created test run with execution details and status\n@errors {400: Bad Request / Validation Failed (10015). Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Payload Too Large. A request sent with an Idempotency-Key whose body exceeds the endpoint's Edge replay-protection limit (256 KB) is rejected before it reaches the service. Requests sent without the header are not subject to this limit., 422: Validation Error. Reusing an Idempotency-Key with a different request body also returns 422 with error code 10027., 503: Service unavailable (10016), including unavailable Edge idempotency protection for a keyed request.}\n\n@endpoint GET /ai/assistants/tests/{test_id}/runs/{run_id}\n@desc Get specific test run details\n@required {test_id: str # Unique identifier of the test., run_id: str # Unique identifier of the run.}\n@returns(200) {run_id: str(uuid), test_id: str(uuid), status: str, triggered_by: str, completed_at: str(date-time), logs: str, conversation_id: str, conversation_insights_id: str, test_suite_run_id: str(uuid), created_at: str(date-time), updated_at: str(date-time), detail_status: [map]} # Returns complete test run details including results, logs, and performance metrics\n@errors {422: Validation Error}\n\n@endpoint DELETE /ai/assistants/{assistant_id}\n@desc Delete an assistant\n@required {assistant_id: str # Unique identifier of the assistant.}\n@returns(200) {id: str, object: str, deleted: bool} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/assistants/{assistant_id}\n@desc Get an assistant\n@required {assistant_id: str # Unique identifier of the assistant.}\n@optional {fetch_dynamic_variables_from_webhook: bool=false # Whether to fetch dynamic variables from the configured webhook., from: str # Start of the filter range., to: str # End of the filter range., call_control_id: str # Filter results by call control id.}\n@returns(200) {id: str, name: str, created_at: str(date-time), version_id: str, version_created_at: str(date-time), description: str, model: str, instructions: str, tools: [any], mcp_servers: [map], a2a_agents: [map], greeting: str, llm_api_key_ref: str, external_llm: map{model: str, base_url: str, llm_api_key_ref: str, authentication_method: str, certificate_ref: str, token_retrieval_url: str, forward_metadata: bool}, fallback_config: map{model: str, llm_api_key_ref: str, external_llm: map{model: str, base_url: str, llm_api_key_ref: str, authentication_method: str, certificate_ref: str, token_retrieval_url: str, forward_metadata: bool}}, voice_settings: map{voice: str, voice_speed: num, api_key_ref: str, temperature: num, similarity_boost: num, use_speaker_boost: bool, style: num, speed: num, language_boost: str?, expressive_mode: bool, background_audio: any}, transcription: map{model: str, language: str, api_key_ref: str, region: str, settings: map{smart_format: bool, numerals: bool, eot_threshold: num, eot_timeout_ms: int, eager_eot_threshold: num, keyterm: str, end_of_turn_confidence_threshold: num, min_turn_silence: int, max_turn_silence: int, interim_results: bool, enable_endpoint_detection: bool, max_endpoint_delay_ms: int, context: str, language_hints: [str]}}, telephony_settings: map{default_texml_app_id: str, supports_unauthenticated_web_calls: bool, noise_suppression: str, noise_suppression_config: map{attenuation_limit: int, mode: str, family: str, size: str, enhancement_level: num}, time_limit_secs: int, user_idle_timeout_secs: int, user_idle_reply_secs: int, fallback_destination: str, send_message_history_updates: bool, voicemail_detection: map{on_voicemail_detected: map{action: str, voicemail_message: map}}, disable_dtmf: bool, recording_settings: map{enabled: bool, channels: str, format: str, stop_on_conversation_end: bool}}, messaging_settings: map{default_messaging_profile_id: str, delivery_status_webhook_url: str, conversation_inactivity_minutes: int}, enabled_features: [str], insight_settings: map{insight_group_id: str}, privacy_settings: map{data_retention: bool, in_transit_data_locality: bool}, dynamic_variables_webhook_url: str, dynamic_variables_webhook_timeout_ms: int, dynamic_variables: map, import_metadata: map{import_provider: str, import_id: str}, widget_settings: map{theme: str, audio_visualizer_config: map{color: str, preset: str}, start_call_text: str, default_state: str, position: str, view_history_url: str?, report_issue_url: str?, give_feedback_url: str?, agent_thinking_text: str, speak_to_interrupt_text: str, logo_icon_url: str?}, interruption_settings: map{enable: bool, disable_greeting_interruption: bool, start_speaking_plan: map{wait_seconds: num(float), transcription_endpointing_plan: map{on_punctuation_seconds: num(float), on_no_punctuation_seconds: num(float), on_number_seconds: num(float)}}, interrupt_prediction_threshold: num?}, integrations: [map], observability_settings: map{status: str, secret_key_ref: str, public_key_ref: str, host: str, prompt_name: str, prompt_version: int, prompt_label: str, prompt_sync: str}, version_name: str, related_mission_ids: [str], tags: [str], post_conversation_settings: map{enabled: bool}, conversation_flow: map{edges: [map], nodes: [any], start_node_id: str}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/assistants/{assistant_id}\n@desc Update an assistant\n@required {assistant_id: str # Unique identifier of the assistant.}\n@returns(200) {id: str, name: str, created_at: str(date-time), version_id: str, version_created_at: str(date-time), description: str, model: str, instructions: str, tools: [any], mcp_servers: [map], a2a_agents: [map], greeting: str, llm_api_key_ref: str, external_llm: map{model: str, base_url: str, llm_api_key_ref: str, authentication_method: str, certificate_ref: str, token_retrieval_url: str, forward_metadata: bool}, fallback_config: map{model: str, llm_api_key_ref: str, external_llm: map{model: str, base_url: str, llm_api_key_ref: str, authentication_method: str, certificate_ref: str, token_retrieval_url: str, forward_metadata: bool}}, voice_settings: map{voice: str, voice_speed: num, api_key_ref: str, temperature: num, similarity_boost: num, use_speaker_boost: bool, style: num, speed: num, language_boost: str?, expressive_mode: bool, background_audio: any}, transcription: map{model: str, language: str, api_key_ref: str, region: str, settings: map{smart_format: bool, numerals: bool, eot_threshold: num, eot_timeout_ms: int, eager_eot_threshold: num, keyterm: str, end_of_turn_confidence_threshold: num, min_turn_silence: int, max_turn_silence: int, interim_results: bool, enable_endpoint_detection: bool, max_endpoint_delay_ms: int, context: str, language_hints: [str]}}, telephony_settings: map{default_texml_app_id: str, supports_unauthenticated_web_calls: bool, noise_suppression: str, noise_suppression_config: map{attenuation_limit: int, mode: str, family: str, size: str, enhancement_level: num}, time_limit_secs: int, user_idle_timeout_secs: int, user_idle_reply_secs: int, fallback_destination: str, send_message_history_updates: bool, voicemail_detection: map{on_voicemail_detected: map{action: str, voicemail_message: map}}, disable_dtmf: bool, recording_settings: map{enabled: bool, channels: str, format: str, stop_on_conversation_end: bool}}, messaging_settings: map{default_messaging_profile_id: str, delivery_status_webhook_url: str, conversation_inactivity_minutes: int}, enabled_features: [str], insight_settings: map{insight_group_id: str}, privacy_settings: map{data_retention: bool, in_transit_data_locality: bool}, dynamic_variables_webhook_url: str, dynamic_variables_webhook_timeout_ms: int, dynamic_variables: map, import_metadata: map{import_provider: str, import_id: str}, widget_settings: map{theme: str, audio_visualizer_config: map{color: str, preset: str}, start_call_text: str, default_state: str, position: str, view_history_url: str?, report_issue_url: str?, give_feedback_url: str?, agent_thinking_text: str, speak_to_interrupt_text: str, logo_icon_url: str?}, interruption_settings: map{enable: bool, disable_greeting_interruption: bool, start_speaking_plan: map{wait_seconds: num(float), transcription_endpointing_plan: map{on_punctuation_seconds: num(float), on_no_punctuation_seconds: num(float), on_number_seconds: num(float)}}, interrupt_prediction_threshold: num?}, integrations: [map], observability_settings: map{status: str, secret_key_ref: str, public_key_ref: str, host: str, prompt_name: str, prompt_version: int, prompt_label: str, prompt_sync: str}, version_name: str, related_mission_ids: [str], tags: [str], post_conversation_settings: map{enabled: bool}, conversation_flow: map{edges: [map], nodes: [any], start_node_id: str}} # Successful Response\n@errors {400: Bad Request. The resulting assistant configuration was rejected. For example, enabling `privacy_settings.in_transit_data_locality` is refused when the organization's data-locality region has no in-region inference, or when any model the assistant could use — its `model`, its `fallback_config`, or a conversation-flow node override — is not Telnyx-hosted. The response detail names the model and where it is configured. Validation runs against the merged result of the update, not only the fields sent., 422: Validation Error}\n\n@endpoint DELETE /ai/assistants/{assistant_id}/canary-deploys\n@desc Delete Canary Deploy\n@required {assistant_id: str # Unique identifier of the assistant.}\n@returns(204) Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/assistants/{assistant_id}/canary-deploys\n@desc Get Canary Deploy\n@required {assistant_id: str # Unique identifier of the assistant.}\n@returns(200) {assistant_id: str, rules: [map], created_at: str(date-time), updated_at: str(date-time)} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/assistants/{assistant_id}/canary-deploys\n@desc Create Canary Deploy\n@required {assistant_id: str # Unique identifier of the assistant.}\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key., rules: [map{match: [map], serve!: map}]}\n@returns(200) {assistant_id: str, rules: [map], created_at: str(date-time), updated_at: str(date-time)} # Successful Response\n@errors {400: Bad Request / Validation Failed (10015). Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Payload Too Large. A request sent with an Idempotency-Key whose body exceeds the endpoint's Edge replay-protection limit (256 KB) is rejected before it reaches the service. Requests sent without the header are not subject to this limit., 422: Validation Error. Reusing an Idempotency-Key with a different request body also returns 422 with error code 10027., 503: Service unavailable (10016), including unavailable Edge idempotency protection for a keyed request.}\n@example_request {\"rules\":[{\"match\":[{\"attribute\":\"Attribute\",\"operator\":\"in\",\"values\":[\"string\"]}],\"serve\":{\"version_id\":\"Version Id\",\"rollout\":[{\"version_id\":\"Version Id\",\"weight\":0}]}}]}\n\n@endpoint PUT /ai/assistants/{assistant_id}/canary-deploys\n@desc Update Canary Deploy\n@required {assistant_id: str # Unique identifier of the assistant.}\n@optional {rules: [map{match: [map], serve!: map}]}\n@returns(200) {assistant_id: str, rules: [map], created_at: str(date-time), updated_at: str(date-time)} # Successful Response\n@errors {422: Validation Error}\n@example_request {\"rules\":[{\"match\":[{\"attribute\":\"Attribute\",\"operator\":\"in\",\"values\":[\"string\"]}],\"serve\":{\"version_id\":\"Version Id\",\"rollout\":[{\"version_id\":\"Version Id\",\"weight\":0}]}}]}\n\n@endpoint POST /ai/assistants/{assistant_id}/chat\n@desc Assistant Chat\n@required {assistant_id: str # Unique identifier of the assistant., content: str # The message content sent by the client to the assistant, conversation_id: str # A unique identifier for the conversation thread, used to maintain context}\n@optional {name: str # The optional display name of the user sending the message, stream: bool=false # When true, the response is streamed as Server-Sent Events (`text/event-stream`): `delta` events carry content fragments as they are generated, a final `done` event carries the full content plus `whatsapp_template`, and a terminal `error` event reports failures that happen after streaming started. When false (default), the response is a single JSON object.}\n@returns(200) {content: str} # Successful Response\n@errors {400: Bad Request. The turn was refused before any message content was processed. For example, an assistant with `privacy_settings.in_transit_data_locality` enabled refuses a request that entered the platform outside the organization's data-locality region, or that this deployment cannot serve in that region; the response detail names the API hostname to send it to., 422: Validation Error}\n\n@endpoint POST /ai/assistants/{assistant_id}/chat/sms\n@desc Assistant Sms Chat\n@required {assistant_id: str # Unique identifier of the assistant., from: str, to: str}\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key., text: str, conversation_metadata: map, should_create_conversation: bool}\n@returns(200) {conversation_id: str} # Successful Response\n@errors {400: Bad Request / Validation Failed (10015). Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Payload Too Large. A request sent with an Idempotency-Key whose body exceeds the endpoint's Edge replay-protection limit (256 KB) is rejected before it reaches the service. Requests sent without the header are not subject to this limit., 422: Validation Error. Reusing an Idempotency-Key with a different request body also returns 422 with error code 10027., 503: Service unavailable (10016), including unavailable Edge idempotency protection for a keyed request.}\n@example_request {\"from\":\"From\",\"to\":\"To\",\"text\":\"Text\",\"should_create_conversation\":false}\n\n@endpoint POST /ai/assistants/{assistant_id}/clone\n@desc Clone Assistant\n@required {assistant_id: str # Unique identifier of the assistant.}\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key.}\n@returns(200) {id: str, name: str, created_at: str(date-time), version_id: str, version_created_at: str(date-time), description: str, model: str, instructions: str, tools: [any], mcp_servers: [map], a2a_agents: [map], greeting: str, llm_api_key_ref: str, external_llm: map{model: str, base_url: str, llm_api_key_ref: str, authentication_method: str, certificate_ref: str, token_retrieval_url: str, forward_metadata: bool}, fallback_config: map{model: str, llm_api_key_ref: str, external_llm: map{model: str, base_url: str, llm_api_key_ref: str, authentication_method: str, certificate_ref: str, token_retrieval_url: str, forward_metadata: bool}}, voice_settings: map{voice: str, voice_speed: num, api_key_ref: str, temperature: num, similarity_boost: num, use_speaker_boost: bool, style: num, speed: num, language_boost: str?, expressive_mode: bool, background_audio: any}, transcription: map{model: str, language: str, api_key_ref: str, region: str, settings: map{smart_format: bool, numerals: bool, eot_threshold: num, eot_timeout_ms: int, eager_eot_threshold: num, keyterm: str, end_of_turn_confidence_threshold: num, min_turn_silence: int, max_turn_silence: int, interim_results: bool, enable_endpoint_detection: bool, max_endpoint_delay_ms: int, context: str, language_hints: [str]}}, telephony_settings: map{default_texml_app_id: str, supports_unauthenticated_web_calls: bool, noise_suppression: str, noise_suppression_config: map{attenuation_limit: int, mode: str, family: str, size: str, enhancement_level: num}, time_limit_secs: int, user_idle_timeout_secs: int, user_idle_reply_secs: int, fallback_destination: str, send_message_history_updates: bool, voicemail_detection: map{on_voicemail_detected: map{action: str, voicemail_message: map}}, disable_dtmf: bool, recording_settings: map{enabled: bool, channels: str, format: str, stop_on_conversation_end: bool}}, messaging_settings: map{default_messaging_profile_id: str, delivery_status_webhook_url: str, conversation_inactivity_minutes: int}, enabled_features: [str], insight_settings: map{insight_group_id: str}, privacy_settings: map{data_retention: bool, in_transit_data_locality: bool}, dynamic_variables_webhook_url: str, dynamic_variables_webhook_timeout_ms: int, dynamic_variables: map, import_metadata: map{import_provider: str, import_id: str}, widget_settings: map{theme: str, audio_visualizer_config: map{color: str, preset: str}, start_call_text: str, default_state: str, position: str, view_history_url: str?, report_issue_url: str?, give_feedback_url: str?, agent_thinking_text: str, speak_to_interrupt_text: str, logo_icon_url: str?}, interruption_settings: map{enable: bool, disable_greeting_interruption: bool, start_speaking_plan: map{wait_seconds: num(float), transcription_endpointing_plan: map{on_punctuation_seconds: num(float), on_no_punctuation_seconds: num(float), on_number_seconds: num(float)}}, interrupt_prediction_threshold: num?}, integrations: [map], observability_settings: map{status: str, secret_key_ref: str, public_key_ref: str, host: str, prompt_name: str, prompt_version: int, prompt_label: str, prompt_sync: str}, version_name: str, related_mission_ids: [str], tags: [str], post_conversation_settings: map{enabled: bool}, conversation_flow: map{edges: [map], nodes: [any], start_node_id: str}} # Successful Response\n@errors {400: Bad Request / Validation Failed (10015). Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Payload Too Large. A request sent with an Idempotency-Key whose body exceeds the endpoint's Edge replay-protection limit (256 KB) is rejected before it reaches the service. Requests sent without the header are not subject to this limit., 422: Validation Error. Reusing an Idempotency-Key with a different request body also returns 422 with error code 10027., 503: Service unavailable (10016), including unavailable Edge idempotency protection for a keyed request.}\n\n@endpoint POST /ai/assistants/{assistant_id}/instructions/enhance\n@desc Enhance Assistant Instructions\n@required {assistant_id: str # Unique identifier of the assistant.}\n@optional {enhancement_prompt: any # Optional guidance describing how the instructions should be enhanced. When provided, the LLM applies these requested changes in addition to fixing any identified issues., instructions: any # The instructions to enhance. When omitted, the assistant's existing instructions are used.}\n@returns(200) A stream of enhanced instruction text. The body is sent as `text/plain` using chunked transfer encoding.\n@errors {422: Validation Error}\n@example_request {\"enhancement_prompt\":\"string\",\"instructions\":\"string\"}\n\n@endpoint GET /ai/assistants/{assistant_id}/scheduled_events\n@desc List scheduled events\n@required {assistant_id: str # Unique identifier of the assistant.}\n@optional {from_date: str(date-time) # Start of the date range filter (inclusive, ISO 8601)., to_date: str(date-time) # End of the date range filter (inclusive, ISO 8601)., conversation_channel: str # Filter results by conversation channel., page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}, data: [any]} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/assistants/{assistant_id}/scheduled_events\n@desc Create a scheduled event\n@required {assistant_id: str # Unique identifier of the assistant., telnyx_conversation_channel: str(phone_call/sms_chat), telnyx_end_user_target: str # The phone number, SIP URI, to schedule the call or text to., telnyx_agent_target: str # The phone number, SIP URI, to schedule the call or text from., scheduled_at_fixed_datetime: str(date-time) # The datetime at which the event should be scheduled. Formatted as ISO 8601.}\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key., text: str # Required for sms scheduled events. The text to be sent to the end user., conversation_metadata: map # Metadata associated with the conversation. Telnyx provides several pieces of metadata, but customers can also add their own., dynamic_variables: map # A map of dynamic variable names to values. These variables can be referenced in the assistant's instructions and messages using {{variable_name}} syntax., max_retries_client_errors: int=0 # Configure number of retries on client errors: busy, no-answer, failed, canceled (caller hung up before the callee answered), retry_interval_secs: int, call_settings: map{sip_region: str} # Per-call telephony overrides applied when a scheduled phone-call event dispatches. Phone-call events only. New per-call dispatch options should be added here rather than as top-level event fields.}\n@returns(201) Successful Response\n@errors {400: Bad Request / Validation Failed (10015). Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Payload Too Large. A request sent with an Idempotency-Key whose body exceeds the endpoint's Edge replay-protection limit (256 KB) is rejected before it reaches the service. Requests sent without the header are not subject to this limit., 422: Validation Error. Reusing an Idempotency-Key with a different request body also returns 422 with error code 10027., 503: Service unavailable (10016), including unavailable Edge idempotency protection for a keyed request.}\n\n@endpoint DELETE /ai/assistants/{assistant_id}/scheduled_events/{event_id}\n@desc Delete a scheduled event\n@required {assistant_id: str # Unique identifier of the assistant., event_id: str # Unique identifier of the event.}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/assistants/{assistant_id}/scheduled_events/{event_id}\n@desc Get a scheduled event\n@required {assistant_id: str # Unique identifier of the assistant., event_id: str # Unique identifier of the event.}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/assistants/{assistant_id}/tags\n@desc Add Assistant Tag\n@required {assistant_id: str # Unique identifier of the assistant., tag: str}\n@returns(200) {tags: [str]} # Successful Response\n@errors {422: Validation Error}\n@example_request {\"tag\":\"Tag\"}\n\n@endpoint DELETE /ai/assistants/{assistant_id}/tags/{tag}\n@desc Remove Assistant Tag\n@required {assistant_id: str # Unique identifier of the assistant., tag: str # Unique identifier of the tag.}\n@returns(200) {tags: [str]} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/assistants/{assistant_id}/texml\n@desc Get assistant texml\n@required {assistant_id: str # Unique identifier of the assistant.}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n\n@endpoint DELETE /ai/assistants/{assistant_id}/tools/{tool_id}\n@desc Remove Assistant Tool\n@required {assistant_id: str # Unique identifier of the assistant., tool_id: str # Unique identifier of the tool.}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n\n@endpoint PUT /ai/assistants/{assistant_id}/tools/{tool_id}\n@desc Add Assistant Tool\n@required {assistant_id: str # Unique identifier of the assistant., tool_id: str # Unique identifier of the tool.}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/assistants/{assistant_id}/tools/{tool_id}/test\n@desc Test Assistant Tool\n@required {assistant_id: str # Unique identifier of the assistant., tool_id: str # Unique identifier of the tool.}\n@optional {arguments: map # Key-value arguments to use for the webhook test, dynamic_variables: map # Key-value dynamic variables to use for the webhook test}\n@returns(200) {data: map{success: bool, status_code: int, content_type: str, response: str, request: map}} # Successful Response\n@errors {422: Validation Error}\n@example_request {\"arguments\":{\"order_id\":\"order_12345\"},\"dynamic_variables\":{\"customer_name\":\"Ada\"}}\n\n@endpoint GET /ai/assistants/{assistant_id}/versions\n@desc Get all versions of an assistant\n@required {assistant_id: str # Unique identifier of the assistant.}\n@returns(200) {data: [map]} # Returns list of assistant versions ordered by creation date (newest first)\n@errors {422: Validation Error}\n\n@endpoint DELETE /ai/assistants/{assistant_id}/versions/{version_id}\n@desc Delete a specific assistant version\n@required {assistant_id: str # Unique identifier of the assistant., version_id: str # Unique identifier of the version.}\n@returns(204) Returns HTTP 204 No Content on successful deletion\n@errors {422: Validation Error}\n\n@endpoint GET /ai/assistants/{assistant_id}/versions/{version_id}\n@desc Get a specific assistant version\n@required {assistant_id: str # Unique identifier of the assistant., version_id: str # Unique identifier of the version.}\n@optional {include_mcp_servers: bool # Whether to include MCP servers in the response.}\n@returns(200) {id: str, name: str, created_at: str(date-time), version_id: str, version_created_at: str(date-time), description: str, model: str, instructions: str, tools: [any], mcp_servers: [map], a2a_agents: [map], greeting: str, llm_api_key_ref: str, external_llm: map{model: str, base_url: str, llm_api_key_ref: str, authentication_method: str, certificate_ref: str, token_retrieval_url: str, forward_metadata: bool}, fallback_config: map{model: str, llm_api_key_ref: str, external_llm: map{model: str, base_url: str, llm_api_key_ref: str, authentication_method: str, certificate_ref: str, token_retrieval_url: str, forward_metadata: bool}}, voice_settings: map{voice: str, voice_speed: num, api_key_ref: str, temperature: num, similarity_boost: num, use_speaker_boost: bool, style: num, speed: num, language_boost: str?, expressive_mode: bool, background_audio: any}, transcription: map{model: str, language: str, api_key_ref: str, region: str, settings: map{smart_format: bool, numerals: bool, eot_threshold: num, eot_timeout_ms: int, eager_eot_threshold: num, keyterm: str, end_of_turn_confidence_threshold: num, min_turn_silence: int, max_turn_silence: int, interim_results: bool, enable_endpoint_detection: bool, max_endpoint_delay_ms: int, context: str, language_hints: [str]}}, telephony_settings: map{default_texml_app_id: str, supports_unauthenticated_web_calls: bool, noise_suppression: str, noise_suppression_config: map{attenuation_limit: int, mode: str, family: str, size: str, enhancement_level: num}, time_limit_secs: int, user_idle_timeout_secs: int, user_idle_reply_secs: int, fallback_destination: str, send_message_history_updates: bool, voicemail_detection: map{on_voicemail_detected: map{action: str, voicemail_message: map}}, disable_dtmf: bool, recording_settings: map{enabled: bool, channels: str, format: str, stop_on_conversation_end: bool}}, messaging_settings: map{default_messaging_profile_id: str, delivery_status_webhook_url: str, conversation_inactivity_minutes: int}, enabled_features: [str], insight_settings: map{insight_group_id: str}, privacy_settings: map{data_retention: bool, in_transit_data_locality: bool}, dynamic_variables_webhook_url: str, dynamic_variables_webhook_timeout_ms: int, dynamic_variables: map, import_metadata: map{import_provider: str, import_id: str}, widget_settings: map{theme: str, audio_visualizer_config: map{color: str, preset: str}, start_call_text: str, default_state: str, position: str, view_history_url: str?, report_issue_url: str?, give_feedback_url: str?, agent_thinking_text: str, speak_to_interrupt_text: str, logo_icon_url: str?}, interruption_settings: map{enable: bool, disable_greeting_interruption: bool, start_speaking_plan: map{wait_seconds: num(float), transcription_endpointing_plan: map{on_punctuation_seconds: num(float), on_no_punctuation_seconds: num(float), on_number_seconds: num(float)}}, interrupt_prediction_threshold: num?}, integrations: [map], observability_settings: map{status: str, secret_key_ref: str, public_key_ref: str, host: str, prompt_name: str, prompt_version: int, prompt_label: str, prompt_sync: str}, version_name: str, related_mission_ids: [str], tags: [str], post_conversation_settings: map{enabled: bool}, conversation_flow: map{edges: [map], nodes: [any], start_node_id: str}} # Returns the specific assistant version configuration\n@errors {422: Validation Error}\n\n@endpoint POST /ai/assistants/{assistant_id}/versions/{version_id}\n@desc Update a specific assistant version\n@required {assistant_id: str # Unique identifier of the assistant., version_id: str # Unique identifier of the version.}\n@optional {name: str, model: str # ID of the model to use when `external_llm` is not set. You can use the [Get models API](https://developers.telnyx.com/api-reference/openai-chat/get-available-models-openai-compatible) to see available models. If `external_llm` is provided, the assistant uses `external_llm` instead of this field. If neither `model` nor `external_llm` is provided, Telnyx applies the default model., instructions: str # System instructions for the assistant. These may be templated with [dynamic variables](https://developers.telnyx.com/docs/inference/ai-assistants/dynamic-variables), tools: [any] # Deprecated for new integrations. Inline tool definitions available to the assistant. Prefer `tool_ids` to attach shared tools created with the AI Tools endpoints. On update, a sent `tools` array fully replaces the assistant's inline tools; omit the field to leave them unchanged. Each tool type except `function`, `webhook`, and `client_side_tool` allows at most one instance per assistant, counted across inline `tools` and shared `tool_ids` combined., mcp_servers: [map{id!: str, allowed_tools: [str]}]= # MCP servers attached to the assistant. Create MCP servers with `/ai/mcp_servers`, then reference them by `id` here., a2a_agents: [map{name!: str, url!: str, headers: [map], async: bool, timeout_ms: int, poll_interval_ms: int, messages: [any]}] # A2A agents this assistant can delegate to. Tools are not stored here: at the start of every conversation each agent's card is fetched and one tool is derived per skill the card advertises, named `a2a__`. The following limits are not enforced when the assistant is saved, and anything past them is dropped when the conversation starts: 64 agents per assistant, 64 skills per card, 128 derived tools per assistant, and a 6 second budget for all card fetches combined. An agent whose card cannot be fetched costs the assistant that capability for the conversation; it does not fail the call. Omit this field to leave the assistant's agents unchanged; send an empty array to remove them all., tool_ids: [str] # IDs of shared tools to attach to the assistant. New integrations should prefer `tool_ids` over inline `tools`. On update, a sent `tool_ids` array fully replaces the assistant's attached shared tools; omit the field to leave them unchanged. Single-instance tool types are counted across inline `tools` and `tool_ids` combined, so attaching a shared tool of such a type when an instance already exists returns HTTP 400 with error code 10015., description: str, greeting: str # Text that the assistant will use to start the conversation. This may be templated with [dynamic variables](https://developers.telnyx.com/docs/inference/ai-assistants/dynamic-variables). Use an empty string to have the assistant wait for the user to speak first. Use the special value `` to have the assistant generate the greeting based on the system instructions., llm_api_key_ref: str # This is only needed when using third-party inference providers selected by `model`. The `identifier` for an integration secret [/v2/integration_secrets](https://developers.telnyx.com/api-reference/integration-secrets/create-a-secret) that refers to your LLM provider's API key. For bring-your-own endpoint authentication, use `external_llm.llm_api_key_ref` instead. Warning: Free plans are unlikely to work with this integration., external_llm: map{model!: str, base_url!: str, llm_api_key_ref: str, authentication_method: str, certificate_ref: str, token_retrieval_url: str, forward_metadata: bool}, fallback_config: map{model: str, llm_api_key_ref: str, external_llm: map}, voice_settings: map{voice!: str, voice_speed: num, api_key_ref: str, temperature: num, similarity_boost: num, use_speaker_boost: bool, style: num, speed: num, language_boost: str, expressive_mode: bool, background_audio: any}, transcription: map{model: str, language: str, api_key_ref: str, region: str, settings: map}, telephony_settings: map{default_texml_app_id: str, supports_unauthenticated_web_calls: bool, noise_suppression: str, noise_suppression_config: map, time_limit_secs: int, user_idle_timeout_secs: int, user_idle_reply_secs: int, fallback_destination: str, send_message_history_updates: bool, voicemail_detection: map, disable_dtmf: bool, recording_settings: map}, messaging_settings: map{default_messaging_profile_id: str, delivery_status_webhook_url: str, conversation_inactivity_minutes: int}, enabled_features: [str], insight_settings: map{insight_group_id: str}, privacy_settings: map{data_retention: bool, in_transit_data_locality: bool}, dynamic_variables_webhook_url: str # If `dynamic_variables_webhook_url` is set, Telnyx sends a POST request to this URL at the start of the conversation to resolve dynamic variables. **Gotcha:** the webhook response must wrap variables under a top-level `dynamic_variables` object, e.g. `{\"dynamic_variables\": {\"customer_name\": \"Jane\"}}`. Returning a flat object will be ignored and variables will fall back to their defaults. See the [dynamic variables guide](https://developers.telnyx.com/docs/inference/ai-assistants/dynamic-variables) for the full request/response format and timeout behavior., dynamic_variables_webhook_timeout_ms: int=1500 # Timeout in milliseconds for the dynamic variables webhook. Must be between 1 and 10000 ms. If the webhook does not respond within this timeout, the call proceeds with default values. See the [dynamic variables guide](https://developers.telnyx.com/docs/inference/ai-assistants/dynamic-variables)., dynamic_variables: map # Map of dynamic variables and their default values, widget_settings: map{theme: str, audio_visualizer_config: map, start_call_text: str, default_state: str, position: str, view_history_url: str, report_issue_url: str, give_feedback_url: str, agent_thinking_text: str, speak_to_interrupt_text: str, logo_icon_url: str} # Configuration settings for the assistant's web widget., interruption_settings: map{enable: bool, disable_greeting_interruption: bool, start_speaking_plan: map, interrupt_prediction_threshold: num} # Settings for interruptions and how the assistant decides the user has finished speaking. These timings are most relevant when using non turn-taking transcription models. For turn-taking models like `deepgram/flux`, end-of-turn behavior is controlled by the transcription end-of-turn settings under `transcription.settings` (`eot_threshold`, `eot_timeout_ms`, `eager_eot_threshold`)., integrations: [map{integration_id!: str, allowed_list: [str]}]= # Connected integrations attached to the assistant. The catalog of available integrations is at `/ai/integrations`; the user's connected integrations are at `/ai/integrations/connections`. Each item references a catalog integration by `integration_id`., observability_settings: map{status: str, secret_key_ref: str, public_key_ref: str, host: str, prompt_name: str, prompt_version: int, prompt_label: str, prompt_sync: str}, tags: [str]= # Tags associated with the assistant. Tags can also be managed with the assistant tag endpoints., version_name: str=New assistant # Human-readable name for the assistant version., post_conversation_settings: map{enabled: bool} # Configuration for post-conversation processing. When enabled, the assistant receives one additional LLM turn after the conversation ends, allowing it to execute final tool calls such as sending a summary or updating a record via webhook or function tools. Integration and MCP server tools are not available post-conversation; call-control tools (e.g. hangup, transfer) are also unavailable. Beta feature., conversation_flow: map{edges: [map], nodes!: [any], start_node_id!: str} # Conversation flow as supplied by API clients (create / update).  A directed graph of `FlowNodeReq` connected by `FlowEdge`s. Validation enforces unique node/edge IDs, that `start_node_id` references a real node, and that every edge's endpoints reference real nodes.}\n@returns(200) {id: str, name: str, created_at: str(date-time), version_id: str, version_created_at: str(date-time), description: str, model: str, instructions: str, tools: [any], mcp_servers: [map], a2a_agents: [map], greeting: str, llm_api_key_ref: str, external_llm: map{model: str, base_url: str, llm_api_key_ref: str, authentication_method: str, certificate_ref: str, token_retrieval_url: str, forward_metadata: bool}, fallback_config: map{model: str, llm_api_key_ref: str, external_llm: map{model: str, base_url: str, llm_api_key_ref: str, authentication_method: str, certificate_ref: str, token_retrieval_url: str, forward_metadata: bool}}, voice_settings: map{voice: str, voice_speed: num, api_key_ref: str, temperature: num, similarity_boost: num, use_speaker_boost: bool, style: num, speed: num, language_boost: str?, expressive_mode: bool, background_audio: any}, transcription: map{model: str, language: str, api_key_ref: str, region: str, settings: map{smart_format: bool, numerals: bool, eot_threshold: num, eot_timeout_ms: int, eager_eot_threshold: num, keyterm: str, end_of_turn_confidence_threshold: num, min_turn_silence: int, max_turn_silence: int, interim_results: bool, enable_endpoint_detection: bool, max_endpoint_delay_ms: int, context: str, language_hints: [str]}}, telephony_settings: map{default_texml_app_id: str, supports_unauthenticated_web_calls: bool, noise_suppression: str, noise_suppression_config: map{attenuation_limit: int, mode: str, family: str, size: str, enhancement_level: num}, time_limit_secs: int, user_idle_timeout_secs: int, user_idle_reply_secs: int, fallback_destination: str, send_message_history_updates: bool, voicemail_detection: map{on_voicemail_detected: map{action: str, voicemail_message: map}}, disable_dtmf: bool, recording_settings: map{enabled: bool, channels: str, format: str, stop_on_conversation_end: bool}}, messaging_settings: map{default_messaging_profile_id: str, delivery_status_webhook_url: str, conversation_inactivity_minutes: int}, enabled_features: [str], insight_settings: map{insight_group_id: str}, privacy_settings: map{data_retention: bool, in_transit_data_locality: bool}, dynamic_variables_webhook_url: str, dynamic_variables_webhook_timeout_ms: int, dynamic_variables: map, import_metadata: map{import_provider: str, import_id: str}, widget_settings: map{theme: str, audio_visualizer_config: map{color: str, preset: str}, start_call_text: str, default_state: str, position: str, view_history_url: str?, report_issue_url: str?, give_feedback_url: str?, agent_thinking_text: str, speak_to_interrupt_text: str, logo_icon_url: str?}, interruption_settings: map{enable: bool, disable_greeting_interruption: bool, start_speaking_plan: map{wait_seconds: num(float), transcription_endpointing_plan: map{on_punctuation_seconds: num(float), on_no_punctuation_seconds: num(float), on_number_seconds: num(float)}}, interrupt_prediction_threshold: num?}, integrations: [map], observability_settings: map{status: str, secret_key_ref: str, public_key_ref: str, host: str, prompt_name: str, prompt_version: int, prompt_label: str, prompt_sync: str}, version_name: str, related_mission_ids: [str], tags: [str], post_conversation_settings: map{enabled: bool}, conversation_flow: map{edges: [map], nodes: [any], start_node_id: str}} # Returns the updated assistant version configuration\n@errors {400: Bad Request. The resulting assistant configuration was rejected. For example, enabling `privacy_settings.in_transit_data_locality` is refused when the organization's data-locality region has no in-region inference, or when any model the assistant could use — its `model`, its `fallback_config`, or a conversation-flow node override — is not Telnyx-hosted. The response detail names the model and where it is configured. Validation runs against the merged result of the update, not only the fields sent., 422: Validation Error}\n\n@endpoint POST /ai/assistants/{assistant_id}/versions/{version_id}/promote\n@desc Promote an assistant version to main\n@required {assistant_id: str # Unique identifier of the assistant., version_id: str # Unique identifier of the version.}\n@returns(200) {id: str, name: str, created_at: str(date-time), version_id: str, version_created_at: str(date-time), description: str, model: str, instructions: str, tools: [any], mcp_servers: [map], a2a_agents: [map], greeting: str, llm_api_key_ref: str, external_llm: map{model: str, base_url: str, llm_api_key_ref: str, authentication_method: str, certificate_ref: str, token_retrieval_url: str, forward_metadata: bool}, fallback_config: map{model: str, llm_api_key_ref: str, external_llm: map{model: str, base_url: str, llm_api_key_ref: str, authentication_method: str, certificate_ref: str, token_retrieval_url: str, forward_metadata: bool}}, voice_settings: map{voice: str, voice_speed: num, api_key_ref: str, temperature: num, similarity_boost: num, use_speaker_boost: bool, style: num, speed: num, language_boost: str?, expressive_mode: bool, background_audio: any}, transcription: map{model: str, language: str, api_key_ref: str, region: str, settings: map{smart_format: bool, numerals: bool, eot_threshold: num, eot_timeout_ms: int, eager_eot_threshold: num, keyterm: str, end_of_turn_confidence_threshold: num, min_turn_silence: int, max_turn_silence: int, interim_results: bool, enable_endpoint_detection: bool, max_endpoint_delay_ms: int, context: str, language_hints: [str]}}, telephony_settings: map{default_texml_app_id: str, supports_unauthenticated_web_calls: bool, noise_suppression: str, noise_suppression_config: map{attenuation_limit: int, mode: str, family: str, size: str, enhancement_level: num}, time_limit_secs: int, user_idle_timeout_secs: int, user_idle_reply_secs: int, fallback_destination: str, send_message_history_updates: bool, voicemail_detection: map{on_voicemail_detected: map{action: str, voicemail_message: map}}, disable_dtmf: bool, recording_settings: map{enabled: bool, channels: str, format: str, stop_on_conversation_end: bool}}, messaging_settings: map{default_messaging_profile_id: str, delivery_status_webhook_url: str, conversation_inactivity_minutes: int}, enabled_features: [str], insight_settings: map{insight_group_id: str}, privacy_settings: map{data_retention: bool, in_transit_data_locality: bool}, dynamic_variables_webhook_url: str, dynamic_variables_webhook_timeout_ms: int, dynamic_variables: map, import_metadata: map{import_provider: str, import_id: str}, widget_settings: map{theme: str, audio_visualizer_config: map{color: str, preset: str}, start_call_text: str, default_state: str, position: str, view_history_url: str?, report_issue_url: str?, give_feedback_url: str?, agent_thinking_text: str, speak_to_interrupt_text: str, logo_icon_url: str?}, interruption_settings: map{enable: bool, disable_greeting_interruption: bool, start_speaking_plan: map{wait_seconds: num(float), transcription_endpointing_plan: map{on_punctuation_seconds: num(float), on_no_punctuation_seconds: num(float), on_number_seconds: num(float)}}, interrupt_prediction_threshold: num?}, integrations: [map], observability_settings: map{status: str, secret_key_ref: str, public_key_ref: str, host: str, prompt_name: str, prompt_version: int, prompt_label: str, prompt_sync: str}, version_name: str, related_mission_ids: [str], tags: [str], post_conversation_settings: map{enabled: bool}, conversation_flow: map{edges: [map], nodes: [any], start_node_id: str}} # Returns the promoted assistant configuration\n@errors {422: Validation Error}\n\n@endpoint POST /ai/audio/transcriptions\n@desc Transcribe speech to text\n@returns(200) {text: str, duration: num, segments: [map], words: [map]} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/chat/completions\n@desc Create a chat completion\n@required {messages: [map{content!: any, role!: str}] # A list of the previous chat messages for context.}\n@optional {model: str=meta-llama/Meta-Llama-3.1-8B-Instruct # The language model to chat with., service_tier: str # The service tier to use for this request. Supported values vary by model; use `GET /v2/ai/openai/models` and inspect the model's `service_tiers` field. If omitted, Telnyx-hosted models use `default`., region: str(USA/EU/AUS/UAE) # Optional data-residency region the request should be served from, using the same vocabulary as your account's Data Locality setting. Behavior depends on `mode`. Supported for Telnyx-hosted models only: a request routed to an external provider never passes through Telnyx model routing, so a region cannot be enforced for it. Omit for today's latency-based routing., mode: str(preferred/strict)=preferred # How strictly `region` is applied. `preferred` (the default when `region` is set) tries that region first and falls back to another when the model cannot be served there, so a request that would have succeeded still succeeds. `strict` pins the request: it is served from that region or it fails with a 422, never redirected to another region. Requires `region`., api_key_ref: str # If you are using an external inference provider like xAI or OpenAI, this field allows you to pass along a reference to your API key. After creating an [integration secret](https://developers.telnyx.com/api-reference/integration-secrets/create-a-secret) for you API key, pass the secret's `identifier` in this field., stream: bool=false # Whether or not to stream data-only server-sent events as they become available., temperature: num=0.1 # Adjusts the \"creativity\" of the model. Lower values make the model more deterministic and repetitive, while higher values make the model more random and creative., max_tokens: int=8192 # Maximum number of completion (output) tokens the model may generate per request. Defaults to 8192 when omitted or `null`. Set a higher value to allow longer completions. The model's `max_completion_tokens` metadata (see `GET /ai/models`), when set, caps both the default and any larger explicit value. Reasoning models consume this budget across reasoning and answer tokens combined., tools: [any] # The `function` tool type follows the same schema as the [OpenAI Chat Completions API](https://platform.openai.com/docs/api-reference/chat). The `retrieval` tool type is unique to Telnyx. You may pass a list of [embedded storage buckets](https://developers.telnyx.com/api-reference/embeddings/embed-documents) for retrieval-augmented generation., tool_choice: str(none/auto/required), response_format: any # Output format for the model response. `text` returns plain text, `json_object` enables JSON mode (valid JSON output without a schema), and `json_schema` constrains the output to a schema you supply. For guaranteed schema-conformant structured output on Telnyx-hosted models, use `json_schema`., min_p: num # This is an alternative to `top_p` that [many prefer](https://github.com/huggingface/transformers/issues/27670). Must be in [0, 1]., n: num # This will return multiple choices for you instead of a single chat completion., use_beam_search: bool=false # Setting this to `true` will allow the model to [explore more completion options](https://huggingface.co/blog/how-to-generate#beam-search). This is not supported by OpenAI., best_of: int # This is used with `use_beam_search` to determine how many candidate beams to explore., length_penalty: num=1 # This is used with `use_beam_search` to prefer shorter or longer completions., early_stopping: bool=false # This is used with `use_beam_search`. If `true`, generation stops as soon as there are `best_of` complete candidates; if `false`, a heuristic is applied and the generation stops when is it very unlikely to find better candidates., logprobs: bool=false # Whether to return log probabilities of the output tokens or not. If true, returns the log probabilities of each output token returned in the `content` of `message`., top_logprobs: int # This is used with `logprobs`. An integer between 0 and 20 specifying the number of most likely tokens to return at each token position, each with an associated log probability., frequency_penalty: num=0 # Higher values will penalize the model from repeating the same output tokens., presence_penalty: num=0 # Higher values will penalize the model from repeating the same output tokens., top_p: num # An alternative or complement to `temperature`. This adjusts how many of the top possibilities to consider., stop: any # Up to 4 sequences where the API will stop generating further tokens. The returned text will not contain the stop sequence., seed: int # If specified, the system will make a best effort to sample deterministically, such that repeated requests with the same `seed` and parameters should return the same result., enable_thinking: bool=true # Whether to enable the thinking/reasoning phase for models that support it (e.g., QwQ, Qwen3). When set to false, the model will skip the internal reasoning step and respond directly, which can reduce latency. Defaults to true., reasoning_effort: str(none/minimal/low/medium/high/xhigh/max) # Controls the reasoning effort for models that support it. When set, the model spends more or less compute on internal reasoning before generating its response. Supported values: none, minimal, low, medium, high, xhigh, max. Not all models support all values; unsupported values are rejected with a 400 error. When omitted, reasoning models use their default effort level.}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n@example_request {\"messages\":[{\"role\":\"system\",\"content\":\"You are a friendly chatbot.\"},{\"role\":\"user\",\"content\":\"Hello, world!\"}]}\n\n@endpoint GET /ai/clusters\n@desc List all clusters\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/clusters\n@desc Compute new clusters\n@required {bucket: str # The embedded storage bucket to compute the clusters from. The bucket must already be [embedded](https://developers.telnyx.com/api-reference/embeddings/embed-documents).}\n@optional {prefix: str # Prefix to filter whcih files in the buckets are included., files: [str] # Array of files to filter which are included., min_cluster_size: int=25 # Smallest number of related text chunks to qualify as a cluster. Top-level clusters should be thought of as identifying broad themes in your data., min_subcluster_size: int=5 # Smallest number of related text chunks to qualify as a sub-cluster. Sub-clusters should be thought of as identifying more specific topics within a broader theme.}\n@returns(200) {data: map{task_id: str}} # Successful Response\n@errors {422: Validation Error}\n@example_request {\"bucket\":\"string\",\"prefix\":\"string\",\"files\":[\"string\"],\"min_cluster_size\":25,\"min_subcluster_size\":5}\n\n@endpoint DELETE /ai/clusters/{task_id}\n@desc Delete a cluster\n@required {task_id: str # Unique identifier of the task.}\n@returns(204) Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/clusters/{task_id}\n@desc Fetch a cluster\n@required {task_id: str # Unique identifier of the task.}\n@optional {top_n_nodes: int=0 # The number of nodes in the cluster to return in the response. Nodes will be sorted by their centrality within the cluster., show_subclusters: bool=false # Whether or not to include subclusters and their nodes in the response.}\n@returns(200) {data: map{status: str, bucket: str, clusters: [map]}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/clusters/{task_id}/graph\n@desc Fetch a cluster visualization\n@required {task_id: str # Unique identifier of the task.}\n@optional {cluster_id: int # Filter results by cluster id.}\n@returns(200) Successful Response - Returns a PNG image of the cluster visualization.\n@errors {422: Validation Error}\n\n@endpoint GET /ai/collections\n@desc List collections\n@optional {page[number]: int=1: any # Page number to return (1-based). Defaults to 1., page[size]: int=20 # Number of results per page. Defaults to 20.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # A paginated list of collections.\n@errors {401: Missing or invalid authentication.}\n\n@endpoint POST /ai/collections\n@desc Create a collection\n@required {name: str # Human-readable collection name.}\n@optional {description: str # Optional description., slug: str # Optional slug (unique per organization). Derived from `name` when omitted., sources: [map{source_type!: str, bucket_id: str}] # Optional sources to attach at creation time., settings: any # Optional retrieval settings.}\n@returns(201) {data: map{uuid: str(uuid), slug: str, record_type: str, name: str, description: str, status: str, sources: [map], settings: map{record_type: str, retrieval: map{top_k: int, retrieval_type: str}}, created_at: str(date-time), updated_at: str(date-time)}} # Collection created.\n@errors {400: The request was malformed or failed validation., 401: Missing or invalid authentication., 409: The request conflicts with existing state (e.g. duplicate slug or duplicate source)., 422: Validation error -- a `bucket` source without a `bucket_id` (`invalid_source_configuration`), an unknown `source_type` (`invalid_source_type`), an unsupported `retrieval_type` (`unsupported_retrieval_type`), or `top_k` out of range 1-50 (`invalid_top_k`).}\n\n@endpoint GET /ai/collections/slug/{slug}\n@desc Get a collection by slug\n@required {slug: str # The collection's slug (unique within your organization).}\n@returns(200) {data: map{uuid: str(uuid), slug: str, record_type: str, name: str, description: str, status: str, sources: [map], settings: map{record_type: str, retrieval: map{top_k: int, retrieval_type: str}}, created_at: str(date-time), updated_at: str(date-time)}} # The collection.\n@errors {401: Missing or invalid authentication., 404: The requested resource does not exist.}\n\n@endpoint DELETE /ai/collections/{uuid}\n@desc Delete a collection\n@required {uuid: str(uuid) # The collection's unique identifier.}\n@returns(204) Collection deleted.\n@errors {401: Missing or invalid authentication., 404: The requested resource does not exist.}\n\n@endpoint GET /ai/collections/{uuid}\n@desc Get a collection\n@required {uuid: str(uuid) # The collection's unique identifier.}\n@returns(200) {data: map{uuid: str(uuid), slug: str, record_type: str, name: str, description: str, status: str, sources: [map], settings: map{record_type: str, retrieval: map{top_k: int, retrieval_type: str}}, created_at: str(date-time), updated_at: str(date-time)}} # The collection.\n@errors {401: Missing or invalid authentication., 404: The requested resource does not exist.}\n\n@endpoint PATCH /ai/collections/{uuid}\n@desc Update a collection\n@required {uuid: str(uuid) # The collection's unique identifier.}\n@optional {name: str, description: str}\n@returns(200) {data: map{uuid: str(uuid), slug: str, record_type: str, name: str, description: str, status: str, sources: [map], settings: map{record_type: str, retrieval: map{top_k: int, retrieval_type: str}}, created_at: str(date-time), updated_at: str(date-time)}} # The updated collection.\n@errors {400: The request was malformed or failed validation., 401: Missing or invalid authentication., 404: The requested resource does not exist.}\n\n@endpoint GET /ai/collections/{uuid}/settings\n@desc Get collection settings\n@required {uuid: str(uuid) # The collection's unique identifier.}\n@returns(200) {data: map{record_type: str, retrieval: map{top_k: int, retrieval_type: str}}} # The collection's retrieval settings.\n@errors {401: Missing or invalid authentication., 404: The requested resource does not exist.}\n\n@endpoint PATCH /ai/collections/{uuid}/settings\n@desc Update collection settings\n@required {uuid: str(uuid) # The collection's unique identifier.}\n@optional {retrieval: map{top_k: int, retrieval_type: str} # How documents are retrieved when searching the collection.}\n@returns(200) {data: map{record_type: str, retrieval: map{top_k: int, retrieval_type: str}}} # The updated settings.\n@errors {400: The request was malformed or failed validation., 401: Missing or invalid authentication., 404: The requested resource does not exist., 422: Validation error -- unsupported `retrieval_type` (`unsupported_retrieval_type`) or `top_k` out of range 1-50 (`invalid_top_k`).}\n\n@endpoint PUT /ai/collections/{uuid}/settings\n@desc Replace collection settings\n@required {uuid: str(uuid) # The collection's unique identifier.}\n@optional {retrieval: map{top_k: int, retrieval_type: str} # How documents are retrieved when searching the collection.}\n@returns(200) {data: map{record_type: str, retrieval: map{top_k: int, retrieval_type: str}}} # The updated settings.\n@errors {400: The request was malformed or failed validation., 401: Missing or invalid authentication., 404: The requested resource does not exist., 422: Validation error -- unsupported `retrieval_type` (`unsupported_retrieval_type`) or `top_k` out of range 1-50 (`invalid_top_k`).}\n\n@endpoint GET /ai/collections/{uuid}/sources\n@desc List collection sources\n@required {uuid: str(uuid) # The collection's unique identifier.}\n@returns(200) {data: [map]} # The collection's sources.\n@errors {401: Missing or invalid authentication., 404: The requested resource does not exist.}\n\n@endpoint POST /ai/collections/{uuid}/sources\n@desc Add a collection source\n@required {uuid: str(uuid) # The collection's unique identifier., source_type: str(voice/meeting_bot/message/bucket) # The type of Telnyx data attached as a source. `bucket` requires an additional `bucket_id`. Only `voice` is searchable today; `meeting_bot`, `message`, and `bucket` attach but are not yet searchable (Coming soon).}\n@optional {bucket_id: str # The Telnyx Storage bucket name. Required when `source_type` is `bucket`; ignored otherwise.}\n@returns(201) {data: map{id: str, record_type: str, collection_id: str(uuid), source_type: str, bucket_id: str, status: str}} # The created source.\n@errors {400: The request was malformed or failed validation., 401: Missing or invalid authentication., 404: The requested resource does not exist., 409: The request conflicts with existing state (e.g. duplicate slug or duplicate source)., 422: Invalid source configuration -- `bucket` without a `bucket_id` (`invalid_source_configuration`) or an unknown `source_type` (`invalid_source_type`).}\n\n@endpoint PUT /ai/collections/{uuid}/sources\n@desc Replace collection sources\n@required {uuid: str(uuid) # The collection's unique identifier., sources: [map{source_type!: str, bucket_id: str}]}\n@returns(200) {data: [map], meta: map{added: [str], retained: [str], removed: [str]}} # The reconciled source list.\n@errors {400: The request was malformed or failed validation., 401: Missing or invalid authentication., 404: The requested resource does not exist., 409: The request conflicts with existing state (e.g. duplicate slug or duplicate source)., 422: Invalid source configuration -- `bucket` without a `bucket_id` (`invalid_source_configuration`) or an unknown `source_type` (`invalid_source_type`).}\n\n@endpoint DELETE /ai/collections/{uuid}/sources/{sourceId}\n@desc Remove a collection source\n@required {uuid: str(uuid) # The collection's unique identifier., sourceId: str # The identifier of the source to remove.}\n@returns(204) Source removed.\n@errors {401: Missing or invalid authentication., 404: The requested resource does not exist.}\n\n@endpoint GET /ai/conversation_histories\n@desc Search conversation histories\n@required {q: str # Natural language search query. The text is embedded into a 1024-dimensional vector and compared against indexed record chunks using semantic similarity.}\n@optional {region: str(USA/DEU/AUS/UAE) # Restrict search to a specific region. When omitted, all regions are queried in parallel (fan-out) and results are merged by similarity score., page[number]: int=1 # Page number to return (1-based). Defaults to 1., page[size]: int=20 # Number of results per page. Defaults to 20, maximum 100., min_score: num(float)=0 # Minimum cosine similarity score threshold (0.0 to 1.0). Results below this threshold are excluded., filter[user_id]: str # Filter to records owned by a specific user (exact match)., filter[record_id]: str # Filter to chunks belonging to a specific parent record (exact match)., filter[region][in]: str # Filter by the region stored on the record. Comma-separated to match multiple regions (USA, DEU, AUS, UAE). Distinct from the `region` parameter, which selects which cluster(s) are queried., filter[record_created_at][gte]: str(date-time) # Only include records whose original creation time is on or after this ISO 8601 timestamp., filter[record_created_at][lte]: str(date-time) # Only include records whose original creation time is on or before this ISO 8601 timestamp., filter[ingested_at][gte]: str(date-time) # Only include records ingested (chunked, embedded, and indexed) on or after this ISO 8601 timestamp., filter[ingested_at][lte]: str(date-time) # Only include records ingested (chunked, embedded, and indexed) on or before this ISO 8601 timestamp., filter[retention]: str # Filter by retention policy (exact match). Filter-only: not returned in the response body.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful search response with ranked conversation history chunks.\n@errors {400: Invalid request parameters — invalid region or malformed filter expression., 401: Missing or invalid authentication. Provide a valid Telnyx API key via the Authorization: Bearer header., 422: Request validation failed (e.g., missing required parameter)., 500: Server-side error — embeddings service unavailable, search backend unreachable, or internal processing failure., 503: Service not initialized — bootstrap still in progress.}\n\n@endpoint GET /ai/conversations\n@desc List conversations\n@optional {id: str # Filter by conversation ID (e.g. id=eq.123), name: str # Filter by conversation Name (e.g. `name=like.Voice%`), created_at: str # Filter by creation datetime (e.g., `created_at=gte.2025-01-01`), last_message_at: str # Filter by last message datetime (e.g., `last_message_at=lte.2025-06-01`), metadata->assistant_id: str # Filter by assistant ID (e.g., `metadata->assistant_id=eq.assistant-123`), metadata->call_control_id: str # Filter by call control ID (e.g., `metadata->call_control_id=eq.v3:123`), metadata->telnyx_agent_target: str # Filter by the phone number, SIP URI, or other identifier for the agent (e.g., `metadata->telnyx_agent_target=eq.+13128675309`), metadata->telnyx_end_user_target: str # Filter by the phone number, SIP URI, or other identifier for the end user (e.g., `metadata->telnyx_end_user_target=eq.+13128675309`), metadata->telnyx_conversation_channel: str # Filter by conversation channel (e.g., `metadata->telnyx_conversation_channel=eq.phone_call`), limit: int # Limit the number of returned conversations (e.g., `limit=10`), order: str # Order the results by specific fields (e.g., `order=created_at.desc` or `order=last_message_at.asc`), or: str # Apply OR conditions using PostgREST syntax (e.g., `or=(created_at.gte.2025-04-01,last_message_at.gte.2025-04-01)`)}\n@returns(200) {data: [map]} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/conversations\n@desc Create a conversation\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key., name: str, metadata: map # Metadata associated with the conversation. Set `ai_disabled` to `true` to create the conversation with AI message responses disabled.}\n@returns(200) {id: str(uuid), name: str, created_at: str(date-time), metadata: map, last_message_at: str(date-time)} # Successful Response\n@errors {400: Bad Request / Validation Failed (10015). Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Payload Too Large. A request sent with an Idempotency-Key whose body exceeds the endpoint's Edge replay-protection limit (256 KB) is rejected before it reaches the service. Requests sent without the header are not subject to this limit., 422: Validation Error. Reusing an Idempotency-Key with a different request body also returns 422 with error code 10027., 503: Service unavailable (10016), including unavailable Edge idempotency protection for a keyed request.}\n@example_request {\"name\":\"string\"}\n\n@endpoint GET /ai/conversations/conversation-insights/aggregates\n@desc Aggregate Conversation Insights\n@optional {group_by: [str] # Fields to group by (can be comma-separated or multiple parameters). Prefix a field with 'metadata.' (e.g. 'metadata.assistant_id') to group by the conversation's metadata instead of the insight result.  Common fields used for over-time charts: - `score` — Group by the insight's score value (e.g. for Agent Instruction Following, User Satisfaction). - `metadata.assistant_id` — Group by the assistant that handled the conversation. - `metadata.assistant_version_id` — Group by the assistant version, useful for comparing performance across versions in the portal's 'Insights Over Time' chart. - `metadata.telnyx_conversation_channel` — Group by conversation channel (phone_call, web_chat, etc.)., show: [str] # Fields to include in the result (can be comma-separated or multiple parameters). Supports the same 'metadata.' prefix as group_by. Each returned row will contain the grouped field values plus a `record_count` indicating how many conversation insights match that combination., insight_id: str(uuid) # Optional insight ID to filter conversation insights. Only insights matching this ID will be included in the aggregation., created_at: str # Filter by creation datetime to scope the aggregation window. Supports range operators (e.g., `created_at=gte.2025-01-01T00:00:00Z` for the start of the range, `created_at=lt.2025-01-02T00:00:00Z` for the end). To build per-day time series (as the portal does for the 'Insights Over Time' chart), issue one request per day bounded by `created_at=gte.` and `created_at=lt.`., metadata.assistant_id: str # Filter by assistant ID (e.g., `metadata.assistant_id=eq.`). When provided, only conversation insights for the specified assistant are aggregated. Used by the portal to scope the 'Insights Over Time' chart to a single assistant.}\n@returns(200) {data: [map]} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/conversations/insight-groups\n@desc Get Insight Template Groups\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/conversations/insight-groups\n@desc Create Insight Template Group\n@required {name: str}\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key., description: str, webhook: str=}\n@returns(200) {data: map{id: str(uuid), name: str, description: str, created_at: str(date-time), insights: [map], webhook: str}} # Successful Response\n@errors {400: Bad Request / Validation Failed (10015). Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Payload Too Large. A request sent with an Idempotency-Key whose body exceeds the endpoint's Edge replay-protection limit (256 KB) is rejected before it reaches the service. Requests sent without the header are not subject to this limit., 422: Validation Error. Reusing an Idempotency-Key with a different request body also returns 422 with error code 10027., 503: Service unavailable (10016), including unavailable Edge idempotency protection for a keyed request.}\n@example_request {\"name\":\"Name\",\"description\":\"Description\",\"webhook\":\"\"}\n\n@endpoint DELETE /ai/conversations/insight-groups/{group_id}\n@desc Delete Insight Template Group\n@required {group_id: str(uuid) # The ID of the insight group}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/conversations/insight-groups/{group_id}\n@desc Get Insight Template Group\n@required {group_id: str(uuid) # The ID of the insight group}\n@returns(200) {data: map{id: str(uuid), name: str, description: str, created_at: str(date-time), insights: [map], webhook: str}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint PUT /ai/conversations/insight-groups/{group_id}\n@desc Update Insight Template Group\n@required {group_id: str(uuid) # The ID of the insight group}\n@optional {name: str, description: str, webhook: str}\n@returns(200) {data: map{id: str(uuid), name: str, description: str, created_at: str(date-time), insights: [map], webhook: str}} # Successful Response\n@errors {422: Validation Error}\n@example_request {\"name\":\"Name\",\"description\":\"Description\",\"webhook\":\"Webhook\"}\n\n@endpoint POST /ai/conversations/insight-groups/{group_id}/insights/{insight_id}/assign\n@desc Assign Insight Template To Group\n@required {group_id: str(uuid) # The ID of the insight group, insight_id: str(uuid) # The ID of the insight}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n\n@endpoint DELETE /ai/conversations/insight-groups/{group_id}/insights/{insight_id}/unassign\n@desc Unassign Insight Template From Group\n@required {group_id: str(uuid) # The ID of the insight group, insight_id: str(uuid) # The ID of the insight}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/conversations/insights\n@desc Get Insight Templates\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/conversations/insights\n@desc Create Insight Template\n@required {instructions: str, name: str}\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key., webhook: str=, json_schema: any # If specified, the output will follow the JSON schema.}\n@returns(200) {data: map{id: str(uuid), instructions: str, created_at: str(date-time), insight_type: str, name: str, webhook: str, json_schema: any}} # Successful Response\n@errors {400: Bad Request / Validation Failed (10015). Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Payload Too Large. A request sent with an Idempotency-Key whose body exceeds the endpoint's Edge replay-protection limit (256 KB) is rejected before it reaches the service. Requests sent without the header are not subject to this limit., 422: Validation Error. Reusing an Idempotency-Key with a different request body also returns 422 with error code 10027., 503: Service unavailable (10016), including unavailable Edge idempotency protection for a keyed request.}\n@example_request {\"instructions\":\"Instructions\",\"name\":\"Name\",\"webhook\":\"\",\"json_schema\":\"string\"}\n\n@endpoint DELETE /ai/conversations/insights/{insight_id}\n@desc Delete Insight Template\n@required {insight_id: str(uuid) # The ID of the insight}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/conversations/insights/{insight_id}\n@desc Get Insight Template\n@required {insight_id: str(uuid) # The ID of the insight}\n@returns(200) {data: map{id: str(uuid), instructions: str, created_at: str(date-time), insight_type: str, name: str, webhook: str, json_schema: any}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint PUT /ai/conversations/insights/{insight_id}\n@desc Update Insight Template\n@required {insight_id: str(uuid) # The ID of the insight}\n@optional {instructions: str, name: str, webhook: str, json_schema: any}\n@returns(200) {data: map{id: str(uuid), instructions: str, created_at: str(date-time), insight_type: str, name: str, webhook: str, json_schema: any}} # Successful Response\n@errors {422: Validation Error}\n@example_request {\"instructions\":\"Instructions\",\"name\":\"Name\",\"webhook\":\"Webhook\",\"json_schema\":\"string\"}\n\n@endpoint DELETE /ai/conversations/{conversation_id}\n@desc Delete a conversation\n@required {conversation_id: str # The ID of the conversation to delete}\n@returns(200) Successful Response\n@errors {404: Conversation Not Found, 422: Validation Error}\n\n@endpoint GET /ai/conversations/{conversation_id}\n@desc Get a conversation\n@required {conversation_id: str # The ID of the conversation to retrieve}\n@returns(200) {data: map{id: str(uuid), name: str, created_at: str(date-time), metadata: map, last_message_at: str(date-time)}} # Successful Response\n@errors {404: Conversation Not Found, 422: Validation Error}\n\n@endpoint PUT /ai/conversations/{conversation_id}\n@desc Update conversation metadata\n@required {conversation_id: str # The ID of the conversation to update}\n@optional {metadata: map # Metadata associated with the conversation. Set `ai_disabled` to `true` to stop AI from responding to messages (e.g., when a human agent takes over). Set to `false` to re-enable AI responses.}\n@returns(200) {data: map{id: str(uuid), name: str, created_at: str(date-time), metadata: map, last_message_at: str(date-time)}} # Successful Update\n@errors {404: Conversation Not Found, 422: Validation Error}\n@example_request {\"metadata\":{\"ai_disabled\":\"true\"}}\n\n@endpoint GET /ai/conversations/{conversation_id}/conversations-insights\n@desc Get insights for a conversation\n@required {conversation_id: str # Unique identifier of the conversation.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/conversations/{conversation_id}/message\n@desc Create Message\n@required {conversation_id: str(uuid) # The ID of the conversation, role: str}\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key., content: str=, name: str, tool_choice: any, tool_calls: [map], tool_call_id: str, sent_at: str(date-time), metadata: map}\n@returns(200) Successful Response\n@errors {400: Bad Request / Validation Failed (10015). Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Payload Too Large. A request sent with an Idempotency-Key whose body exceeds the endpoint's Edge replay-protection limit (256 KB) is rejected before it reaches the service. Requests sent without the header are not subject to this limit., 422: Validation Error. Reusing an Idempotency-Key with a different request body also returns 422 with error code 10027., 503: Service unavailable (10016), including unavailable Edge idempotency protection for a keyed request.}\n@example_request {\"role\":\"Role\",\"content\":\"\",\"name\":\"Name\",\"tool_choice\":\"string\",\"tool_calls\":[],\"tool_call_id\":\"Tool Call Id\",\"sent_at\":\"2024-01-23T18:10:02.574Z\"}\n\n@endpoint GET /ai/conversations/{conversation_id}/messages\n@desc Get conversation messages\n@required {conversation_id: str # Unique identifier of the conversation.}\n@optional {page[size]: int=20: any # The number of messages to return per page., page[number]: int=1 # The page number to retrieve.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/embeddings\n@desc Get Tasks by Status\n@optional {status: [str]=processing,queued # List of task statuses i.e. `status=queued&status=processing`}\n@returns(200) {data: [map]} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/embeddings\n@desc Embed documents\n@required {bucket_name: str}\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key., document_chunk_size: int=1024, document_chunk_overlap_size: int=512, embedding_model: any=thenlper/gte-large, loader: any=default}\n@returns(200) {data: map{task_id: str(uuid), task_name: str, status: str, created_at: str, finished_at: str?, user_id: str(uuid)}} # Successful Response\n@errors {400: Bad Request / Validation Failed (10015). Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Payload Too Large. A request sent with an Idempotency-Key whose body exceeds the endpoint's Edge replay-protection limit (256 KB) is rejected before it reaches the service. Requests sent without the header are not subject to this limit., 422: Validation Error. Reusing an Idempotency-Key with a different request body also returns 422 with error code 10027., 503: Service unavailable (10016), including unavailable Edge idempotency protection for a keyed request.}\n@example_request {\"bucket_name\":\"Bucket Name\",\"document_chunk_size\":1024,\"document_chunk_overlap_size\":512,\"embedding_model\":\"thenlper/gte-large\",\"loader\":\"default\"}\n\n@endpoint GET /ai/embeddings/buckets\n@desc List embedded buckets\n@returns(200) {data: map{buckets: [str]}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint DELETE /ai/embeddings/buckets/{bucket_name}\n@desc Disable AI for an Embedded Bucket\n@required {bucket_name: str # Name of the bucket.}\n@returns(200) Bucket Embeddings Deleted Successfully\n@errors {404: Bucket Not Found, 422: Validation Error}\n\n@endpoint GET /ai/embeddings/buckets/{bucket_name}\n@desc Get file-level embedding statuses for a bucket\n@required {bucket_name: str # Name of the bucket.}\n@returns(200) {data: [map]} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/embeddings/similarity-search\n@desc Search for documents\n@required {bucket_name: str, query: str}\n@optional {num_of_docs: int=3}\n@returns(200) {data: [map]} # Successful Response\n@errors {422: Validation Error}\n@example_request {\"bucket_name\":\"Bucket Name\",\"query\":\"Query\",\"num_of_docs\":3}\n\n@endpoint POST /ai/embeddings/url\n@desc Embed URL content\n@required {url: str # The URL of the webpage to embed, bucket_name: str # Name of the bucket to store the embeddings. This bucket must already exist.}\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key.}\n@returns(200) {data: map{task_id: str(uuid), task_name: str, status: str, created_at: str, finished_at: str?, user_id: str(uuid)}} # Successful Response\n@errors {400: Bad Request / Validation Failed (10015). Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Payload Too Large. A request sent with an Idempotency-Key whose body exceeds the endpoint's Edge replay-protection limit (256 KB) is rejected before it reaches the service. Requests sent without the header are not subject to this limit., 422: Validation Error. Reusing an Idempotency-Key with a different request body also returns 422 with error code 10027., 503: Service unavailable (10016), including unavailable Edge idempotency protection for a keyed request.}\n@example_request {\"url\":\"URL\",\"bucket_name\":\"Bucket Name\"}\n\n@endpoint GET /ai/embeddings/{task_id}\n@desc Get an embedding task's status\n@required {task_id: str # Unique identifier of the task.}\n@returns(200) {data: map{task_id: str(uuid), task_name: str, status: str, created_at: str, finished_at: str}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/fine_tuning/jobs\n@desc List fine tuning jobs\n@returns(200) {data: [map]} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/fine_tuning/jobs\n@desc Create a fine tuning job\n@required {model: str # The base model that is being fine-tuned., training_file: str # The storage bucket or object used for training.}\n@optional {suffix: str # Optional suffix to append to the fine tuned model's name., hyperparameters: map{n_epochs: int} # The hyperparameters used for the fine-tuning job.}\n@returns(200) {id: str, created_at: int, finished_at: int?, hyperparameters: map{n_epochs: int}, model: str, organization_id: str, status: str, trained_tokens: int?, training_file: str} # Successful Response\n@errors {422: Validation Error}\n@example_request {\"model\":\"string\",\"training_file\":\"string\",\"suffix\":\"string\",\"hyperparameters\":{\"n_epochs\":3}}\n\n@endpoint GET /ai/fine_tuning/jobs/{job_id}\n@desc Get a fine tuning job\n@required {job_id: str # Unique identifier of the job.}\n@returns(200) {id: str, created_at: int, finished_at: int?, hyperparameters: map{n_epochs: int}, model: str, organization_id: str, status: str, trained_tokens: int?, training_file: str} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/fine_tuning/jobs/{job_id}/cancel\n@desc Cancel a fine tuning job\n@required {job_id: str # Unique identifier of the job.}\n@returns(200) {id: str, created_at: int, finished_at: int?, hyperparameters: map{n_epochs: int}, model: str, organization_id: str, status: str, trained_tokens: int?, training_file: str} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/integrations\n@desc List Integrations\n@returns(200) {data: [map]} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/integrations/connections\n@desc List User Integrations\n@returns(200) {data: [map]} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint DELETE /ai/integrations/connections/{user_connection_id}\n@desc Delete Integration Connection\n@required {user_connection_id: str # The user integration connection identifier}\n@returns(204) No Content - Integration connection deleted successfully\n@errors {422: Validation Error}\n\n@endpoint GET /ai/integrations/connections/{user_connection_id}\n@desc Get User Integration connection By Id\n@required {user_connection_id: str # The connection id}\n@returns(200) {data: map{id: str, integration_id: str, allowed_tools: [str]}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/integrations/{integration_id}\n@desc List Integration By Id\n@required {integration_id: str # The integration id}\n@returns(200) {id: str, name: str, display_name: str, description: str, logo_url: str, status: str, available_tools: [str]} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/knowledge/collections/{slug}/documents\n@desc Search collection documents\n@required {slug: str # The collection's slug (unique within your organization).}\n@optional {query: str # Natural-language search query. When provided, the text is matched against the collection's document chunks using the collection's `retrieval_type` (vector or hybrid). When omitted, documents are returned as a plain catalog listing., top_k: int # Maximum number of ranked results to consider. When omitted, the collection's configured `top_k` setting is used., sources: str # Comma-separated list of source types to restrict the search to. When omitted, all of the collection's sources are searched., retrieval_type: str(vector/hybrid/keyword) # Reserved; not yet functional. A value supplied here is accepted but ignored — it does not override the collection's configured strategy, and it is not echoed back. Searches run `vector` retrieval, and `meta.retrieval_type` reports the mode that actually ran. To change retrieval strategy, set it on the collection's settings subresource., filter: map # Field filters applied before ranking, using `filter[field][operator]=value`. Supported operators: `eq` (default), `in`, `gte`, `gt`, `lte`, `lt`, `contains`. Known fields: `record_type`, `record_id`, `user_id`, `record_created_at`, `ingested_at`; any other name resolves to a `metadata.` filter. Example: `filter[record_id][eq]=rec_123`., page[number]: int=1 # Page number to return (1-based). Defaults to 1., page[size]: int=20 # Number of results per page. Defaults to 20.}\n@returns(200) {data: [map], meta: map{collection_slug: str, searched_sources: [str], retrieval_type: str, top_k: int, total_results: int, total_pages: int, page_number: int, page_size: int}} # Ranked (or listed) collection documents.\n@errors {400: The request was malformed or failed validation., 401: Missing or invalid authentication., 404: The collection does not exist or is not searchable., 422: The collection has no searchable sources.}\n\n@endpoint GET /ai/mcp_servers\n@desc List MCP Servers\n@optional {type: str # Filter results by type., url: str # Filter results by url., page[size]: int=20 # Number of items to return per page., page[number]: int=1 # Page number to retrieve (1-based).}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/mcp_servers\n@desc Create MCP Server\n@required {name: str, type: str, url: str}\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key., api_key_ref: str, allowed_tools: [str]}\n@returns(200) {id: str, name: str, type: str, url: str, api_key_ref: str?, allowed_tools: [str]?, created_at: str(date-time)} # Successful Response\n@errors {400: Bad Request / Validation Failed (10015). Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Payload Too Large. A request sent with an Idempotency-Key whose body exceeds the endpoint's Edge replay-protection limit (256 KB) is rejected before it reaches the service. Requests sent without the header are not subject to this limit., 422: Validation Error. Reusing an Idempotency-Key with a different request body also returns 422 with error code 10027., 503: Service unavailable (10016), including unavailable Edge idempotency protection for a keyed request.}\n@example_request {\"name\":\"Name\",\"type\":\"Type\",\"url\":\"Url\"}\n\n@endpoint DELETE /ai/mcp_servers/{mcp_server_id}\n@desc Delete MCP Server\n@required {mcp_server_id: str # Unique identifier of the mcp server.}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/mcp_servers/{mcp_server_id}\n@desc Get MCP Server\n@required {mcp_server_id: str # Unique identifier of the mcp server.}\n@returns(200) {id: str, name: str, type: str, url: str, api_key_ref: str?, allowed_tools: [str]?, created_at: str(date-time)} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint PUT /ai/mcp_servers/{mcp_server_id}\n@desc Update MCP Server\n@required {mcp_server_id: str # Unique identifier of the mcp server.}\n@optional {id: str, name: str, type: str, url: str, api_key_ref: str, allowed_tools: [str], created_at: str(date-time)}\n@returns(200) {id: str, name: str, type: str, url: str, api_key_ref: str?, allowed_tools: [str]?, created_at: str(date-time)} # Successful Response\n@errors {422: Validation Error}\n@example_request {\"id\":\"Id\",\"name\":\"Name\",\"type\":\"Type\",\"url\":\"Url\",\"created_at\":\"2024-01-23T18:10:02.574Z\"}\n\n@endpoint GET /ai/memory/namespaces/{namespace}/operations/{operation_id}\n@desc Status of a write\n@required {operation_id: str, namespace: str}\n@returns(200) {data: map{operation_id: str, status: str, created_at: any, completed_at: any}} # Successful Response\n@errors {401: Unauthorized, 404: The operation does not exist, 502: Upstream error}\n\n@endpoint GET /ai/memory/namespaces/{namespace}/profiles\n@desc List a namespace's profiles\n@required {namespace: str}\n@optional {page[number]: int=1: any # The page to return, counting from 1. Bounded in depth: (page[number] - 1) * page[size] may be at most 10000., page[size]: int=20 # How many results a page holds.}\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_pages: int, total_results: int}} # Successful Response\n@errors {401: Unauthorized, 404: The namespace does not exist, 422: Invalid request, 502: Upstream error}\n\n@endpoint DELETE /ai/memory/namespaces/{namespace}/profiles/{profile_id}\n@desc Forget a profile's memories\n@required {namespace: str # The namespace. `default` exists for every organization., profile_id: str # The profile: your identifier for the user, caller or agent this memory is about.}\n@returns(200) {data: map{profile_id: str, memories_deleted: int}} # The profile's memories are gone\n@errors {401: Unauthorized, 404: The namespace does not exist, 502: Upstream error}\n\n@endpoint POST /ai/memory/namespaces/{namespace}/profiles/{profile_id}/ingest\n@desc Ingest a session's messages into a profile\n@required {profile_id: str, namespace: str}\n@optional {session_id: any # Names the session. Re-ingesting the same session replaces what it held and keeps its `source_id`. Omit it to have one derived from the content and returned. No whitespace, control characters, or any of / \\ # ? %.}\n@returns(202) {data: map{operation_id: str, profile_id: str, session_id: str, source_id: str}} # Successful Response\n@errors {401: Unauthorized, 404: The namespace does not exist, 422: Invalid request, 502: Upstream error}\n@example_request {\"messages\":[{\"role\":\"user\",\"content\":\"Invoices go to 220 W Chicago Ave now.\"},{\"role\":\"assistant\",\"content\":\"Got it.\"}]}\n\n@endpoint GET /ai/memory/namespaces/{namespace}/profiles/{profile_id}/memories\n@desc List a profile's memories, most recent first\n@required {profile_id: str, namespace: str}\n@optional {session_id: any # An ingested session, by the `session_id` it was ingested with. Narrows the request to the source that session was stored as., source_id: any # Narrows the listing to the memories extracted from one source, a remembered fact as well as a session. Pass this or `session_id`, not both., page[number]: int=1 # The page to return, counting from 1. Bounded in depth: (page[number] - 1) * page[size] may be at most 10000., page[size]: int=20 # How many results a page holds.}\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_pages: int, total_results: int}} # Successful Response\n@errors {401: Unauthorized, 404: The namespace does not exist, 422: Invalid request, 502: Upstream error}\n\n@endpoint GET /ai/memory/namespaces/{namespace}/profiles/{profile_id}/memories/{memory_id}\n@desc Read one memory, and what it came from\n@required {namespace: str # The namespace. `default` exists for every organization., profile_id: str # The profile: your identifier for the user, caller or agent this memory is about., memory_id: str # A memory's id, as `recall` and the listing return it.}\n@returns(200) {data: map{id: str, text: str, recorded_at: any, source_id: any, derived_from: any}} # Successful Response\n@errors {401: Unauthorized, 404: The memory does not exist, 422: Invalid request, 502: Upstream error}\n\n@endpoint POST /ai/memory/namespaces/{namespace}/profiles/{profile_id}/recall\n@desc Recall a profile's memories, ranked\n@required {profile_id: str, namespace: str, query: str}\n@optional {top_k: any}\n@returns(200) {data: [map]} # Successful Response\n@errors {401: Unauthorized, 404: The namespace does not exist, 422: Invalid request, 502: Upstream error}\n@example_request {\"query\":\"where do invoices go?\",\"top_k\":5}\n\n@endpoint POST /ai/memory/namespaces/{namespace}/profiles/{profile_id}/remember\n@desc Remember one fact, stored as written\n@required {profile_id: str, namespace: str, text: str}\n@returns(202) {data: map{operation_id: str, profile_id: str, source_id: str}} # Successful Response\n@errors {401: Unauthorized, 404: The namespace does not exist, 422: Invalid request, 502: Upstream error}\n@example_request {\"text\":\"Prefers window seats and flies out of ORD\"}\n\n@endpoint GET /ai/memory/namespaces/{namespace}/profiles/{profile_id}/sources\n@desc List a profile's sources, most recently written first\n@required {namespace: str, profile_id: str}\n@optional {session_id: any # An ingested session, by the `session_id` it was ingested with. Narrows the request to the source that session was stored as., page[number]: int=1 # The page to return, counting from 1. Bounded in depth: (page[number] - 1) * page[size] may be at most 10000., page[size]: int=20 # How many results a page holds.}\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_pages: int, total_results: int}} # Successful Response\n@errors {401: Unauthorized, 404: The namespace does not exist, 422: Invalid request, 502: Upstream error}\n\n@endpoint DELETE /ai/memory/namespaces/{namespace}/profiles/{profile_id}/sources/{source_id}\n@desc Forget one source\n@required {namespace: str # The namespace. `default` exists for every organization., profile_id: str # The profile: your identifier for the user, caller or agent this memory is about., source_id: str # Identifies one source within its profile: an ingested session, or one remembered fact. Returned by `ingest` and `remember` when the write is accepted. Re-ingesting a session keeps its source id.}\n@returns(200) {data: map{profile_id: str, source_id: str, memories_deleted: int}} # The source and its memories are gone\n@errors {401: Unauthorized, 404: The source does not exist, 422: Invalid request, 502: Upstream error}\n\n@endpoint GET /ai/memory/namespaces/{namespace}/profiles/{profile_id}/sources/{source_id}\n@desc Read one source, with what was stored\n@required {namespace: str # The namespace. `default` exists for every organization., profile_id: str # The profile: your identifier for the user, caller or agent this memory is about., source_id: str # Identifies one source within its profile: an ingested session, or one remembered fact. Returned by `ingest` and `remember` when the write is accepted. Re-ingesting a session keeps its source id.}\n@returns(200) {data: map{id: str, session_id: any, memory_count: int, created_at: any, updated_at: any, content: any}} # Successful Response\n@errors {401: Unauthorized, 404: The source does not exist, 422: Invalid request, 502: Upstream error}\n\n@endpoint GET /ai/memory/namespaces/{namespace}/profiles/{profile_id}/summary\n@desc Get a profile's precomputed summary\n@required {namespace: str # The namespace. `default` exists for every organization., profile_id: str # The profile: your identifier for the user, caller or agent this memory is about.}\n@returns(200) {data: map{profile_id: str, text: any, generated_at: any, is_stale: bool}} # The profile's summary\n@errors {401: Unauthorized, 404: The namespace does not exist, 502: Upstream error}\n\n@endpoint GET /ai/memory/namespaces/{namespace}/settings\n@desc Get a namespace's settings\n@required {namespace: str # The namespace. `default` exists for every organization.}\n@returns(200) {data: map{summary: map{instructions: any}}} # The namespace's settings\n@errors {401: Unauthorized, 404: The namespace does not exist, 502: Upstream error}\n\n@endpoint PATCH /ai/memory/namespaces/{namespace}/settings\n@desc Change a namespace's settings\n@required {namespace: str # The namespace. `default` exists for every organization.}\n@optional {summary: any # Summary settings to change. Omit to change nothing.}\n@returns(200) {data: map{summary: map{instructions: any}}} # The settings as stored\n@errors {401: Unauthorized, 404: The namespace does not exist, 422: Invalid request, 502: Upstream error}\n@example_request {\"summary\":{\"instructions\":\"Lead with the customer's plan tier. Keep it under 100 words.\"}}\n\n@endpoint GET /ai/missions\n@desc List missions\n@optional {page[number]: int=1: any # Page number (1-based), page[size]: int=20 # Number of items per page}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/missions\n@desc Create mission\n@required {name: str}\n@optional {description: str, model: str, instructions: str, execution_mode: str(external/managed), metadata: map}\n@returns(201) {data: map{mission_id: str(uuid), name: str, description: str, model: str, instructions: str, execution_mode: str, metadata: map, created_at: str(date-time), updated_at: str(date-time)}} # Successful Response\n@errors {422: Validation Error}\n@example_request {\"name\":\"Name\",\"description\":\"Description\",\"model\":\"Model\",\"instructions\":\"Instructions\",\"execution_mode\":\"external\"}\n\n@endpoint GET /ai/missions/events\n@desc List recent events\n@optional {type: str # Filter results by type., page[number]: int=1 # Page number (1-based), page[size]: int=50 # Number of items per page}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/missions/runs\n@desc List recent runs\n@optional {status: str # Filter results by status., page[number]: int=1 # Page number (1-based), page[size]: int=20 # Number of items per page}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint DELETE /ai/missions/{mission_id}\n@desc Delete mission\n@required {mission_id: str(uuid) # Unique identifier of the mission.}\n@returns(204) Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/missions/{mission_id}\n@desc Get mission\n@required {mission_id: str(uuid) # Unique identifier of the mission.}\n@returns(200) {data: map{mission_id: str(uuid), name: str, description: str, model: str, instructions: str, execution_mode: str, metadata: map, created_at: str(date-time), updated_at: str(date-time)}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint PUT /ai/missions/{mission_id}\n@desc Update mission\n@required {mission_id: str(uuid) # Unique identifier of the mission.}\n@optional {name: str, description: str, model: str, instructions: str, execution_mode: str(external/managed), metadata: map}\n@returns(200) {data: map{mission_id: str(uuid), name: str, description: str, model: str, instructions: str, execution_mode: str, metadata: map, created_at: str(date-time), updated_at: str(date-time)}} # Successful Response\n@errors {422: Validation Error}\n@example_request {\"name\":\"Name\",\"description\":\"Description\",\"model\":\"Model\",\"instructions\":\"Instructions\",\"execution_mode\":\"external\"}\n\n@endpoint POST /ai/missions/{mission_id}/clone\n@desc Clone mission\n@required {mission_id: str # Unique identifier of the mission.}\n@returns(201) Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/missions/{mission_id}/knowledge-bases\n@desc List knowledge bases\n@required {mission_id: str # Unique identifier of the mission.}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/missions/{mission_id}/knowledge-bases\n@desc Create knowledge base\n@required {mission_id: str # Unique identifier of the mission.}\n@returns(201) Successful Response\n@errors {422: Validation Error}\n\n@endpoint DELETE /ai/missions/{mission_id}/knowledge-bases/{knowledge_base_id}\n@desc Delete knowledge base\n@required {mission_id: str # Unique identifier of the mission., knowledge_base_id: str # Unique identifier of the knowledge base.}\n@returns(204) Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/missions/{mission_id}/knowledge-bases/{knowledge_base_id}\n@desc Get knowledge base\n@required {mission_id: str # Unique identifier of the mission., knowledge_base_id: str # Unique identifier of the knowledge base.}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n\n@endpoint PUT /ai/missions/{mission_id}/knowledge-bases/{knowledge_base_id}\n@desc Update knowledge base\n@required {mission_id: str # Unique identifier of the mission., knowledge_base_id: str # Unique identifier of the knowledge base.}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/missions/{mission_id}/mcp-servers\n@desc List MCP servers\n@required {mission_id: str # Unique identifier of the mission.}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/missions/{mission_id}/mcp-servers\n@desc Create MCP server\n@required {mission_id: str # Unique identifier of the mission.}\n@returns(201) Successful Response\n@errors {422: Validation Error}\n\n@endpoint DELETE /ai/missions/{mission_id}/mcp-servers/{mcp_server_id}\n@desc Delete MCP server\n@required {mission_id: str # Unique identifier of the mission., mcp_server_id: str # Unique identifier of the mcp server.}\n@returns(204) Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/missions/{mission_id}/mcp-servers/{mcp_server_id}\n@desc Get MCP server\n@required {mission_id: str # Unique identifier of the mission., mcp_server_id: str # Unique identifier of the mcp server.}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n\n@endpoint PUT /ai/missions/{mission_id}/mcp-servers/{mcp_server_id}\n@desc Update MCP server\n@required {mission_id: str # Unique identifier of the mission., mcp_server_id: str # Unique identifier of the mcp server.}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/missions/{mission_id}/runs\n@desc List runs for mission\n@required {mission_id: str(uuid) # Unique identifier of the mission.}\n@optional {status: str # Filter results by status., page[number]: int=1 # Page number (1-based), page[size]: int=20 # Number of items per page}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/missions/{mission_id}/runs\n@desc Start a run\n@required {mission_id: str(uuid) # Unique identifier of the mission.}\n@optional {input: map, metadata: map}\n@returns(201) {data: map{run_id: str(uuid), mission_id: str(uuid), status: str, input: map, started_at: str(date-time), finished_at: str(date-time), result_summary: str, result_payload: map, error: str, metadata: map, updated_at: str(date-time)}} # Successful Response\n@errors {422: Validation Error}\n@example_request {\"input\":{\"objective\":\"Summarize yesterday's failed call attempts\"},\"metadata\":{\"requested_by\":\"docs-example\"}}\n\n@endpoint GET /ai/missions/{mission_id}/runs/{run_id}\n@desc Get run details\n@required {mission_id: str(uuid) # Unique identifier of the mission., run_id: str(uuid) # Unique identifier of the run.}\n@returns(200) {data: map{run_id: str(uuid), mission_id: str(uuid), status: str, input: map, started_at: str(date-time), finished_at: str(date-time), result_summary: str, result_payload: map, error: str, metadata: map, updated_at: str(date-time)}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint PATCH /ai/missions/{mission_id}/runs/{run_id}\n@desc Update run\n@required {mission_id: str(uuid) # Unique identifier of the mission., run_id: str(uuid) # Unique identifier of the run.}\n@optional {status: str(pending/running/paused/succeeded/failed/cancelled), result_summary: str, result_payload: map, error: str, metadata: map}\n@returns(200) {data: map{run_id: str(uuid), mission_id: str(uuid), status: str, input: map, started_at: str(date-time), finished_at: str(date-time), result_summary: str, result_payload: map, error: str, metadata: map, updated_at: str(date-time)}} # Successful Response\n@errors {422: Validation Error}\n@example_request {\"status\":\"succeeded\",\"result_summary\":\"Processed 24 customer records successfully.\"}\n\n@endpoint POST /ai/missions/{mission_id}/runs/{run_id}/cancel\n@desc Cancel run\n@required {mission_id: str(uuid) # Unique identifier of the mission., run_id: str(uuid) # Unique identifier of the run.}\n@returns(200) {data: map{run_id: str(uuid), mission_id: str(uuid), status: str, input: map, started_at: str(date-time), finished_at: str(date-time), result_summary: str, result_payload: map, error: str, metadata: map, updated_at: str(date-time)}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/missions/{mission_id}/runs/{run_id}/events\n@desc List events\n@required {mission_id: str(uuid) # Unique identifier of the mission., run_id: str(uuid) # Unique identifier of the run.}\n@optional {type: str # Filter results by type., step_id: str # Filter results by step id., agent_id: str # Filter results by agent id., page[number]: int=1 # Page number (1-based), page[size]: int=50 # Number of items per page}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/missions/{mission_id}/runs/{run_id}/events\n@desc Log event\n@required {mission_id: str(uuid) # Unique identifier of the mission., run_id: str(uuid) # Unique identifier of the run., type: str(status_change/step_started/step_completed/step_failed/tool_call/tool_result/message/error/custom), summary: str}\n@optional {step_id: str, agent_id: str, payload: map, idempotency_key: str # Prevents duplicate events on retry}\n@returns(201) {data: map{event_id: str, run_id: str, type: str, summary: str, timestamp: str(date-time), step_id: str, agent_id: str, payload: map, idempotency_key: str}} # Successful Response\n@errors {422: Validation Error}\n@example_request {\"type\":\"status_change\",\"summary\":\"Summary\",\"step_id\":\"Step Id\",\"agent_id\":\"Agent Id\",\"idempotency_key\":\"Idempotency Key\"}\n\n@endpoint GET /ai/missions/{mission_id}/runs/{run_id}/events/{event_id}\n@desc Get event details\n@required {mission_id: str(uuid) # Unique identifier of the mission., run_id: str(uuid) # Unique identifier of the run., event_id: str # Unique identifier of the event.}\n@returns(200) {data: map{event_id: str, run_id: str, type: str, summary: str, timestamp: str(date-time), step_id: str, agent_id: str, payload: map, idempotency_key: str}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/missions/{mission_id}/runs/{run_id}/pause\n@desc Pause run\n@required {mission_id: str(uuid) # Unique identifier of the mission., run_id: str(uuid) # Unique identifier of the run.}\n@returns(200) {data: map{run_id: str(uuid), mission_id: str(uuid), status: str, input: map, started_at: str(date-time), finished_at: str(date-time), result_summary: str, result_payload: map, error: str, metadata: map, updated_at: str(date-time)}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/missions/{mission_id}/runs/{run_id}/plan\n@desc Get plan\n@required {mission_id: str(uuid) # Unique identifier of the mission., run_id: str(uuid) # Unique identifier of the run.}\n@returns(200) {data: [map]} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/missions/{mission_id}/runs/{run_id}/plan\n@desc Create initial plan\n@required {mission_id: str(uuid) # Unique identifier of the mission., run_id: str(uuid) # Unique identifier of the run., steps: [map{step_id!: str, description!: str, sequence!: int, parent_step_id: str, metadata: map}]}\n@returns(201) {data: [map]} # Successful Response\n@errors {422: Validation Error}\n@example_request {\"steps\":[{\"step_id\":\"Step Id\",\"description\":\"Description\",\"sequence\":0,\"parent_step_id\":\"Parent Step Id\"}]}\n\n@endpoint POST /ai/missions/{mission_id}/runs/{run_id}/plan/steps\n@desc Add step(s) to plan\n@required {mission_id: str(uuid) # Unique identifier of the mission., run_id: str(uuid) # Unique identifier of the run., steps: [map{step_id!: str, description!: str, sequence!: int, parent_step_id: str, metadata: map}]}\n@returns(201) {data: [map]} # Successful Response\n@errors {422: Validation Error}\n@example_request {\"steps\":[{\"step_id\":\"Step Id\",\"description\":\"Description\",\"sequence\":0,\"parent_step_id\":\"Parent Step Id\"}]}\n\n@endpoint GET /ai/missions/{mission_id}/runs/{run_id}/plan/steps/{step_id}\n@desc Get step details\n@required {mission_id: str(uuid) # Unique identifier of the mission., run_id: str(uuid) # Unique identifier of the run., step_id: str # Unique identifier of the step.}\n@returns(200) {data: map{step_id: str, run_id: str(uuid), parent_step_id: str, sequence: int, description: str, status: str, started_at: str(date-time), completed_at: str(date-time), metadata: map}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint PATCH /ai/missions/{mission_id}/runs/{run_id}/plan/steps/{step_id}\n@desc Update step status\n@required {mission_id: str(uuid) # Unique identifier of the mission., run_id: str(uuid) # Unique identifier of the run., step_id: str # Unique identifier of the step.}\n@optional {status: str(pending/in_progress/completed/skipped/failed), metadata: map}\n@returns(200) {data: map{step_id: str, run_id: str(uuid), parent_step_id: str, sequence: int, description: str, status: str, started_at: str(date-time), completed_at: str(date-time), metadata: map}} # Successful Response\n@errors {422: Validation Error}\n@example_request {\"status\":\"pending\"}\n\n@endpoint POST /ai/missions/{mission_id}/runs/{run_id}/resume\n@desc Resume run\n@required {mission_id: str(uuid) # Unique identifier of the mission., run_id: str(uuid) # Unique identifier of the run.}\n@returns(200) {data: map{run_id: str(uuid), mission_id: str(uuid), status: str, input: map, started_at: str(date-time), finished_at: str(date-time), result_summary: str, result_payload: map, error: str, metadata: map, updated_at: str(date-time)}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/missions/{mission_id}/runs/{run_id}/telnyx-agents\n@desc List linked Telnyx agents\n@required {mission_id: str(uuid) # Unique identifier of the mission., run_id: str(uuid) # Unique identifier of the run.}\n@returns(200) {data: [map]} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/missions/{mission_id}/runs/{run_id}/telnyx-agents\n@desc Link Telnyx agent to run\n@required {mission_id: str(uuid) # Unique identifier of the mission., run_id: str(uuid) # Unique identifier of the run., telnyx_agent_id: str # The Telnyx AI agent ID to link}\n@returns(201) {data: map{run_id: str, telnyx_agent_id: str, created_at: str(date-time)}} # Successful Response\n@errors {422: Validation Error}\n@example_request {\"telnyx_agent_id\":\"Telnyx Agent Id\"}\n\n@endpoint DELETE /ai/missions/{mission_id}/runs/{run_id}/telnyx-agents/{telnyx_agent_id}\n@desc Unlink Telnyx agent\n@required {mission_id: str(uuid) # Unique identifier of the mission., run_id: str(uuid) # Unique identifier of the run., telnyx_agent_id: str # Unique identifier of the telnyx agent.}\n@returns(204) Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/missions/{mission_id}/tools\n@desc List tools\n@required {mission_id: str # Unique identifier of the mission.}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/missions/{mission_id}/tools\n@desc Create tool\n@required {mission_id: str # Unique identifier of the mission.}\n@returns(201) Successful Response\n@errors {422: Validation Error}\n\n@endpoint DELETE /ai/missions/{mission_id}/tools/{tool_id}\n@desc Delete tool\n@required {mission_id: str # Unique identifier of the mission., tool_id: str # Unique identifier of the tool.}\n@returns(204) Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/missions/{mission_id}/tools/{tool_id}\n@desc Get tool\n@required {mission_id: str # Unique identifier of the mission., tool_id: str # Unique identifier of the tool.}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n\n@endpoint PUT /ai/missions/{mission_id}/tools/{tool_id}\n@desc Update tool\n@required {mission_id: str # Unique identifier of the mission., tool_id: str # Unique identifier of the tool.}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/models\n@desc Get available models\n@returns(200) {object: str, data: [map]} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/openai/chat/completions\n@desc Create a chat completion (OpenAI-compatible)\n@required {messages: [map{content!: any, role!: str}] # A list of the previous chat messages for context.}\n@optional {model: str=meta-llama/Meta-Llama-3.1-8B-Instruct # The language model to chat with., service_tier: str # The service tier to use for this request. Supported values vary by model; use `GET /v2/ai/openai/models` and inspect the model's `service_tiers` field. If omitted, Telnyx-hosted models use `default`., region: str(USA/EU/AUS/UAE) # Optional data-residency region the request should be served from, using the same vocabulary as your account's Data Locality setting. Behavior depends on `mode`. Supported for Telnyx-hosted models only: a request routed to an external provider never passes through Telnyx model routing, so a region cannot be enforced for it. Omit for today's latency-based routing., mode: str(preferred/strict)=preferred # How strictly `region` is applied. `preferred` (the default when `region` is set) tries that region first and falls back to another when the model cannot be served there, so a request that would have succeeded still succeeds. `strict` pins the request: it is served from that region or it fails with a 422, never redirected to another region. Requires `region`., api_key_ref: str # If you are using an external inference provider like xAI or OpenAI, this field allows you to pass along a reference to your API key. After creating an [integration secret](https://developers.telnyx.com/api-reference/integration-secrets/create-a-secret) for you API key, pass the secret's `identifier` in this field., stream: bool=false # Whether or not to stream data-only server-sent events as they become available., temperature: num=0.1 # Adjusts the \"creativity\" of the model. Lower values make the model more deterministic and repetitive, while higher values make the model more random and creative., max_tokens: int=8192 # Maximum number of completion (output) tokens the model may generate per request. Defaults to 8192 when omitted or `null`. Set a higher value to allow longer completions. The model's `max_completion_tokens` metadata (see `GET /ai/models`), when set, caps both the default and any larger explicit value. Reasoning models consume this budget across reasoning and answer tokens combined., tools: [any] # The `function` tool type follows the same schema as the [OpenAI Chat Completions API](https://platform.openai.com/docs/api-reference/chat). The `retrieval` tool type is unique to Telnyx. You may pass a list of [embedded storage buckets](https://developers.telnyx.com/api-reference/embeddings/embed-documents) for retrieval-augmented generation., tool_choice: str(none/auto/required), response_format: any # Output format for the model response. `text` returns plain text, `json_object` enables JSON mode (valid JSON output without a schema), and `json_schema` constrains the output to a schema you supply. For guaranteed schema-conformant structured output on Telnyx-hosted models, use `json_schema`., min_p: num # This is an alternative to `top_p` that [many prefer](https://github.com/huggingface/transformers/issues/27670). Must be in [0, 1]., n: num # This will return multiple choices for you instead of a single chat completion., use_beam_search: bool=false # Setting this to `true` will allow the model to [explore more completion options](https://huggingface.co/blog/how-to-generate#beam-search). This is not supported by OpenAI., best_of: int # This is used with `use_beam_search` to determine how many candidate beams to explore., length_penalty: num=1 # This is used with `use_beam_search` to prefer shorter or longer completions., early_stopping: bool=false # This is used with `use_beam_search`. If `true`, generation stops as soon as there are `best_of` complete candidates; if `false`, a heuristic is applied and the generation stops when is it very unlikely to find better candidates., logprobs: bool=false # Whether to return log probabilities of the output tokens or not. If true, returns the log probabilities of each output token returned in the `content` of `message`., top_logprobs: int # This is used with `logprobs`. An integer between 0 and 20 specifying the number of most likely tokens to return at each token position, each with an associated log probability., frequency_penalty: num=0 # Higher values will penalize the model from repeating the same output tokens., presence_penalty: num=0 # Higher values will penalize the model from repeating the same output tokens., top_p: num # An alternative or complement to `temperature`. This adjusts how many of the top possibilities to consider., stop: any # Up to 4 sequences where the API will stop generating further tokens. The returned text will not contain the stop sequence., seed: int # If specified, the system will make a best effort to sample deterministically, such that repeated requests with the same `seed` and parameters should return the same result., enable_thinking: bool=true # Whether to enable the thinking/reasoning phase for models that support it (e.g., QwQ, Qwen3). When set to false, the model will skip the internal reasoning step and respond directly, which can reduce latency. Defaults to true., reasoning_effort: str(none/minimal/low/medium/high/xhigh/max) # Controls the reasoning effort for models that support it. When set, the model spends more or less compute on internal reasoning before generating its response. Supported values: none, minimal, low, medium, high, xhigh, max. Not all models support all values; unsupported values are rejected with a 400 error. When omitted, reasoning models use their default effort level.}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n@example_request {\"messages\":[{\"role\":\"system\",\"content\":\"You are a friendly chatbot.\"},{\"role\":\"user\",\"content\":\"Hello, world!\"}]}\n\n@endpoint POST /ai/openai/embeddings\n@desc Create embeddings\n@required {input: any # Input text to embed. Can be a string or array of strings., model: str # ID of the model to use. Use the List embedding models endpoint to see available models.}\n@optional {encoding_format: str(float/base64)=float # The format to return the embeddings in., dimensions: int # The number of dimensions the resulting output embeddings should have. Only supported in some models., user: str # A unique identifier representing your end-user for monitoring and abuse detection.}\n@returns(200) {object: str, data: [map], model: str, usage: map{prompt_tokens: int, total_tokens: int}} # Successful Response\n@errors {422: Validation Error}\n@example_request {\"input\":\"The quick brown fox jumps over the lazy dog\",\"model\":\"thenlper/gte-large\"}\n\n@endpoint GET /ai/openai/embeddings/models\n@desc List embedding models\n@returns(200) {object: str, data: [map]} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/openai/models\n@desc Get available models (OpenAI-compatible)\n@returns(200) {object: str, data: [map]} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/openai/responses\n@desc Create an OpenAI-compatible response\n@optional {model: str # Model identifier to use for the response, for example `zai-org/GLM-5.1-FP8` or another model available from the Telnyx OpenAI-compatible models endpoint., service_tier: str # The service tier to use for this request. Supported values vary by model; use `GET /v2/ai/openai/models` and inspect the model's `service_tiers` field. If omitted, Telnyx-hosted models use `default`., region: str(USA/EU/AUS/UAE) # Optional data-residency region the request should be served from, using the same vocabulary as your account's Data Locality setting. Behavior depends on `mode`. Supported for Telnyx-hosted models only: a request routed to an external provider never passes through Telnyx model routing, so a region cannot be enforced for it. Omit for today's latency-based routing., mode: str(preferred/strict)=preferred # How strictly `region` is applied. `preferred` (the default when `region` is set) tries that region first and falls back to another when the model cannot be served there, so a request that would have succeeded still succeeds. `strict` pins the request: it is served from that region or it fails with a 422, never redirected to another region. Requires `region`., input: any # The input items for this turn, using the OpenAI Responses API input format., conversation: str(uuid) # Optional Telnyx Conversation ID from `POST /ai/conversations`. When provided, Telnyx stores this turn on that conversation and uses the conversation's prior messages as context. Reuse the same ID for subsequent turns and tool-result followups. Omit it for a non-persisted, stateless response., instructions: str # Optional system/developer instructions for the model. When used with a persisted `conversation`, send these on the first request that creates the thread; subsequent turns can rely on the stored history., stream: bool # Set to `true` to stream Server-Sent Events, matching OpenAI's Responses streaming format., reasoning: map{effort: str}}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n@example_request {\"model\":\"zai-org/GLM-5.1-FP8\",\"conversation\":\"6a09cdc3-8948-47f0-aa62-74ac943d6c58\",\"instructions\":\"You are a friendly chatbot.\",\"input\":[{\"role\":\"user\",\"content\":[{\"type\":\"input_text\",\"text\":\"Hello, world!\"}]}],\"stream\":false}\n\n@endpoint POST /ai/responses\n@desc Create a response\n@returns(200) Successful Response\n@errors {422: Validation Error}\n@example_request {\"model\":\"zai-org/GLM-5.1-FP8\",\"input\":[{\"role\":\"system\",\"content\":[{\"type\":\"input_text\",\"text\":\"You are a friendly chatbot.\"}]},{\"role\":\"user\",\"content\":[{\"type\":\"input_text\",\"text\":\"Hello, world!\"}]}]}\n\n@endpoint POST /ai/summarize\n@desc Summarize file content\n@required {bucket: str # The name of the bucket that contains the file to be summarized., filename: str # The name of the file to be summarized.}\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key., system_prompt: str # A system prompt to guide the summary generation.}\n@returns(200) {data: map{summary: str}} # Successful Response\n@errors {400: Bad Request / Validation Failed (10015). Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Payload Too Large. A request sent with an Idempotency-Key whose body exceeds the endpoint's Edge replay-protection limit (256 KB) is rejected before it reaches the service. Requests sent without the header are not subject to this limit., 422: Validation Error. Reusing an Idempotency-Key with a different request body also returns 422 with error code 10027., 503: Service unavailable (10016), including unavailable Edge idempotency protection for a keyed request.}\n@example_request {\"bucket\":\"string\",\"filename\":\"string\",\"system_prompt\":\"string\"}\n\n@endpoint GET /ai/tools\n@desc List Tools\n@optional {filter[type]: str: any # Filter results by filter type., filter[name]: str # Filter results by filter name., page[size]: int=20 # Number of items to return per page., page[number]: int=1 # Page number to retrieve (1-based).}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/tools\n@desc Create Tool\n@required {type: str, display_name: str}\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key., function: map, retrieval: map, handoff: map, invite: map, webhook: map, pay: map{connector_name!: str, currency: str, payment_method: str, description: str}, client_side_tool: map, update_dynamic_variables: map{name!: str, description!: str, updatable_variables!: [map]} # Configuration for an update_dynamic_variables tool., timeout_ms: int=5000}\n@returns(200) {id: str, type: str, display_name: str, tool_definition: map, timeout_ms: int, created_at: str} # Successful Response\n@errors {400: Bad Request / Validation Failed (10015). Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Payload Too Large. A request sent with an Idempotency-Key whose body exceeds the endpoint's Edge replay-protection limit (256 KB) is rejected before it reaches the service. Requests sent without the header are not subject to this limit., 422: Validation Error. Reusing an Idempotency-Key with a different request body also returns 422 with error code 10027., 503: Service unavailable (10016), including unavailable Edge idempotency protection for a keyed request.}\n\n@endpoint DELETE /ai/tools/{tool_id}\n@desc Delete Tool\n@required {tool_id: str # Unique identifier of the tool.}\n@returns(200) Successful Response\n@errors {422: Validation Error}\n\n@endpoint GET /ai/tools/{tool_id}\n@desc Get Tool\n@required {tool_id: str # Unique identifier of the tool.}\n@returns(200) {id: str, type: str, display_name: str, tool_definition: map, timeout_ms: int, created_at: str} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint PATCH /ai/tools/{tool_id}\n@desc Update Tool\n@required {tool_id: str # Unique identifier of the tool.}\n@optional {type: str, display_name: str, function: map, retrieval: map, handoff: map, invite: map, webhook: map, pay: map{connector_name!: str, currency: str, payment_method: str, description: str}, client_side_tool: map, update_dynamic_variables: map{name!: str, description!: str, updatable_variables!: [map]} # Configuration for an update_dynamic_variables tool., timeout_ms: int}\n@returns(200) {id: str, type: str, display_name: str, tool_definition: map, timeout_ms: int, created_at: str} # Successful Response\n@errors {422: Validation Error}\n\n@endpoint POST /ai/typesafe/v1/systemone\n@desc Evaluate decision models (TypeSafe-compatible)\n@required {state: any # Text, a JSON object, or an array containing text-based context. Text-only conversation histories are supported; image and audio inputs are not supported., questions: map # Between 1 and 64 named questions. Each key identifies the corresponding answer.}\n@optional {model: str(telnyx/decision-flash/telnyx/decision-pro)=telnyx/decision-flash # Public model alias. telnyx/decision-flash offers the lowest cost and latency; telnyx/decision-pro supports decisions that require long context, including inputs beyond Jev’s 32k per-decision limit. Applies to every question in the request. Other values are rejected.}\n@returns(200) {model: str, answers: map, usage: map{input_tokens: int, output_tokens: int}} # All questions evaluated successfully. The response is a complete JSON object, not a stream.\n@errors {401: Unauthorized. Supply a valid Telnyx API key., 413: Request body is too large or incomplete. Reduce or fix the request., 422: Invalid schema or input token limit exceeded. Correct or split the request before retrying., 429: Too many requests. Reduce concurrency and retry with backoff., 502: The scoring service failed. Retry with bounded backoff., 503: The decision model service is unavailable. Retry with bounded backoff., 504: Evaluation deadline exceeded. Reduce request size or concurrency before retrying., 529: The decision model service is at capacity. Retry with bounded backoff.}\n@example_request {\"model\":\"telnyx/decision-flash\",\"state\":\"Our production calls are failing. Every customer is affected.\",\"questions\":{\"team\":{\"type\":\"choice\",\"instructions\":\"Choose the team that should handle this incident.\",\"criteria\":{\"billing\":\"Payments and refunds\",\"technical_support\":\"Service faults and technical problems\",\"sales\":\"New purchases\"}},\"production_incident\":{\"type\":\"noul\",\"instructions\":\"Does the message describe an active production incident?\"},\"urgency\":{\"type\":\"score\",\"instructions\":\"Rate operational urgency.\",\"criteria\":[\"Low\",\"Normal\",\"High\",\"Critical\"]}}}\n\n@endgroup\n\n@group alphanumeric_sender_ids\n@endpoint GET /alphanumeric_sender_ids\n@desc List alphanumeric sender IDs\n@optional {filter[messaging_profile_id]: str(uuid): any # Filter by messaging profile ID., page[number]: int=1 # Page number., page[size]: int=20 # Page size.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of alphanumeric sender IDs.\n@errors {401: Unauthorized, 422: Unprocessable Entity}\n\n@endpoint POST /alphanumeric_sender_ids\n@desc Create an alphanumeric sender ID\n@required {alphanumeric_sender_id: str # The alphanumeric sender ID string., messaging_profile_id: str(uuid) # The messaging profile to associate the sender ID with.}\n@optional {us_long_code_fallback: str # A US long code number to use as fallback when sending to US destinations.}\n@returns(201) {data: map{record_type: str, id: str(uuid), alphanumeric_sender_id: str, organization_id: str, messaging_profile_id: str(uuid), us_long_code_fallback: str}} # Successful response with a single alphanumeric sender ID.\n@errors {401: Unauthorized, 422: Unprocessable Entity}\n\n@endpoint DELETE /alphanumeric_sender_ids/{id}\n@desc Delete an alphanumeric sender ID\n@required {id: str # The identifier of the alphanumeric sender ID.}\n@returns(200) {data: map{record_type: str, id: str(uuid), alphanumeric_sender_id: str, organization_id: str, messaging_profile_id: str(uuid), us_long_code_fallback: str}} # Successful response with a single alphanumeric sender ID.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint GET /alphanumeric_sender_ids/{id}\n@desc Retrieve an alphanumeric sender ID\n@required {id: str # The identifier of the alphanumeric sender ID.}\n@returns(200) {data: map{record_type: str, id: str(uuid), alphanumeric_sender_id: str, organization_id: str, messaging_profile_id: str(uuid), us_long_code_fallback: str}} # Successful response with a single alphanumeric sender ID.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endgroup\n\n@group audit_events\n@endpoint GET /audit_events\n@desc List Audit Logs\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[created_before], filter[created_after], sort: str(asc/desc) # Set the order of the results by the creation date.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # A list of audit log entries.\n@errors {401: Unexpected error.}\n\n@endgroup\n\n@group authentication_providers\n@endpoint GET /authentication_providers\n@desc List all SSO authentication providers\n@optional {sort: str(name/-name/short_name/-short_name/active/-active/created_at/-created_at/updated_at/-updated_at)=-created_at # Specifies the sort order for results. By default sorting direction is ascending. To have the results sorted in descending order add the - prefix. That is:         name: sorts the result by the     name field in ascending order.           -name: sorts the result by the     name field in descending order.    If not given, results are sorted by created_at in descending order., page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {400: Bad request, 401: Unauthorized, 404: Resource not found}\n\n@endpoint POST /authentication_providers\n@desc Creates an authentication provider\n@required {name: str # The name associated with the authentication provider., short_name: str # The short name associated with the authentication provider. This must be unique and URL-friendly, as it's going to be part of the login URL., settings: map{idp_entity_id!: str(uri), idp_sso_target_url!: str(uri), idp_cert_fingerprint!: str, idp_cert_fingerprint_algorithm: str} # The settings associated with the authentication provider.}\n@optional {active: bool=true # The active status of the authentication provider, settings_url: str(uri) # The URL for the identity provider metadata file to populate the settings automatically. If the settings attribute is provided, that will be used instead.}\n@returns(200) {data: map{id: str(uuid), record_type: str, name: str, short_name: str, organization_id: str(uuid), active: bool, activated_at: str(date-time), settings: map{assertion_consumer_service_url: str(uri), service_provider_entity_id: str(uri), service_provider_login_url: str(uri), idp_entity_id: str(uri), idp_sso_target_url: str(uri), idp_cert_fingerprint: str, idp_cert_fingerprint_algorithm: str, name_identifier_format: str, idp_slo_target_url: str(uri), idp_certificate: str, idp_attribute_names: map, provision_groups: bool}, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {422: Bad request}\n\n@endpoint DELETE /authentication_providers/{id}\n@desc Deletes an authentication provider\n@required {id: str # authentication provider ID}\n@returns(200) {data: map{id: str(uuid), record_type: str, name: str, short_name: str, organization_id: str(uuid), active: bool, activated_at: str(date-time), settings: map{assertion_consumer_service_url: str(uri), service_provider_entity_id: str(uri), service_provider_login_url: str(uri), idp_entity_id: str(uri), idp_sso_target_url: str(uri), idp_cert_fingerprint: str, idp_cert_fingerprint_algorithm: str, name_identifier_format: str, idp_slo_target_url: str(uri), idp_certificate: str, idp_attribute_names: map, provision_groups: bool}, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {401: Unauthorized, 404: Resource not found, 422: Bad request}\n\n@endpoint GET /authentication_providers/{id}\n@desc Retrieve an authentication provider\n@required {id: str # authentication provider ID}\n@returns(200) {data: map{id: str(uuid), record_type: str, name: str, short_name: str, organization_id: str(uuid), active: bool, activated_at: str(date-time), settings: map{assertion_consumer_service_url: str(uri), service_provider_entity_id: str(uri), service_provider_login_url: str(uri), idp_entity_id: str(uri), idp_sso_target_url: str(uri), idp_cert_fingerprint: str, idp_cert_fingerprint_algorithm: str, name_identifier_format: str, idp_slo_target_url: str(uri), idp_certificate: str, idp_attribute_names: map, provision_groups: bool}, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {401: Unauthorized, 404: Resource not found, 422: Bad request}\n\n@endpoint PATCH /authentication_providers/{id}\n@desc Update an authentication provider\n@required {id: str # Identifies the resource.}\n@optional {name: str # The name associated with the authentication provider., short_name: str # The short name associated with the authentication provider. This must be unique and URL-friendly, as it's going to be part of the login URL., active: bool=true # The active status of the authentication provider, settings: map{idp_entity_id!: str(uri), idp_sso_target_url!: str(uri), idp_cert_fingerprint!: str, idp_cert_fingerprint_algorithm: str} # The settings associated with the authentication provider., settings_url: str(uri) # The URL for the identity provider metadata file to populate the settings automatically. If the settings attribute is provided, that will be used instead.}\n@returns(200) {data: map{id: str(uuid), record_type: str, name: str, short_name: str, organization_id: str(uuid), active: bool, activated_at: str(date-time), settings: map{assertion_consumer_service_url: str(uri), service_provider_entity_id: str(uri), service_provider_login_url: str(uri), idp_entity_id: str(uri), idp_sso_target_url: str(uri), idp_cert_fingerprint: str, idp_cert_fingerprint_algorithm: str, name_identifier_format: str, idp_slo_target_url: str(uri), idp_certificate: str, idp_attribute_names: map, provision_groups: bool}, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {401: Unauthorized, 404: Resource not found, 422: Bad request}\n@example_request {\"name\":\"Okta\",\"short_name\":\"myorg\",\"active\":true,\"settings\":{\"idp_entity_id\":\"https://myorg.myidp.com/saml/metadata\",\"idp_sso_target_url\":\"https://myorg.myidp.com/trust/saml2/http-post/sso\",\"idp_cert_fingerprint\":\"13:38:C7:BB:C9:FF:4A:70:38:3A:E3:D9:5C:CD:DB:2E:50:1E:80:A7\",\"idp_cert_fingerprint_algorithm\":\"sha1\"}}\n\n@endgroup\n\n@group available_phone_number_blocks\n@endpoint GET /available_phone_number_blocks\n@desc List available phone number blocks\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[locality], filter[country_code], filter[national_destination_code], filter[phone_number_type]}\n@returns(200) {data: [map], meta: map{total_results: int, best_effort_results: int}} # Successful response with a list of available phone numbers blocks.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group available_phone_numbers\n@endpoint GET /available_phone_numbers\n@desc List available phone numbers\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[phone_number], filter[locality], filter[administrative_area], filter[country_code], filter[national_destination_code], filter[rate_center], filter[phone_number_type], filter[features], filter[limit], filter[best_effort], filter[quickship], filter[reservable], filter[exclude_held_numbers]}\n@returns(200) {data: [map], meta: map{total_results: int, best_effort_results: int}, metadata: map{total_results: int, best_effort_results: int}} # Successful response with a list of available phone numbers.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group balance\n@endpoint GET /balance\n@desc Get user balance details\n@returns(200) {data: map{pending: str, record_type: str, balance: str, credit_limit: str, available_credit: str, currency: str}} # Get user balance details\n@errors {403: Insufficient permissions to access balance information, 422: Invalid or missing account information, 503: Service temporarily unavailable}\n\n@endgroup\n\n@group billing_groups\n@endpoint GET /billing_groups\n@desc List all billing groups\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # A paginated array of billing groups\n@errors {400: Invalid request parameters}\n\n@endpoint POST /billing_groups\n@desc Create a billing group\n@optional {name: str # A name for the billing group}\n@returns(200) {data: map{record_type: str, id: str(uuid), organization_id: str(uuid), name: str, created_at: str(date-time), updated_at: str(date-time), deleted_at: str(date-time)?}} # Expected billing group response to a valid request\n@errors {409: Resource conflict or in use, 422: Invalid request data}\n@example_request {\"name\":\"string\"}\n\n@endpoint DELETE /billing_groups/{id}\n@desc Delete a billing group\n@required {id: str(uuid) # The id of the billing group}\n@returns(200) {data: map{record_type: str, id: str(uuid), organization_id: str(uuid), name: str, created_at: str(date-time), updated_at: str(date-time), deleted_at: str(date-time)?}} # Expected billing group response to a valid request\n@errors {403: Insufficient permissions to access billing group, 404: Billing group not found, 409: Resource conflict or in use, 422: Invalid request data}\n\n@endpoint GET /billing_groups/{id}\n@desc Get a billing group\n@required {id: str(uuid) # The id of the billing group}\n@returns(200) {data: map{record_type: str, id: str(uuid), organization_id: str(uuid), name: str, created_at: str(date-time), updated_at: str(date-time), deleted_at: str(date-time)?}} # Expected billing group response to a valid request\n@errors {403: Insufficient permissions to access billing group, 404: Billing group not found}\n\n@endpoint PATCH /billing_groups/{id}\n@desc Update a billing group\n@required {id: str(uuid) # The id of the billing group}\n@optional {name: str # A name for the billing group}\n@returns(200) {data: map{record_type: str, id: str(uuid), organization_id: str(uuid), name: str, created_at: str(date-time), updated_at: str(date-time), deleted_at: str(date-time)?}} # Expected billing group response to a valid request\n@errors {403: Insufficient permissions to access billing group, 404: Billing group not found, 422: Invalid request data}\n@example_request {\"name\":\"string\"}\n\n@endgroup\n\n@group bulk_sim_card_actions\n@endpoint GET /bulk_sim_card_actions\n@desc List bulk SIM card actions\n@optional {page[number]: int=1: any # The page number to load., page[size]: int=20 # The size of the page., filter[action_type]: str(bulk_disable_voice/bulk_enable_voice/bulk_set_public_ips) # Filter by action type.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {401: Unauthorized}\n\n@endpoint GET /bulk_sim_card_actions/{id}\n@desc Get bulk SIM card action details\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: map{id: str(uuid), record_type: str, action_type: str, settings: map, sim_card_actions_summary: [map], created_at: str, updated_at: str}} # Successful Response\n@errors {401: Unauthorized}\n\n@endgroup\n\n@group bundle_pricing\n@endpoint GET /bundle_pricing/billing_bundles\n@desc Retrieve Bundles\n@optional {filter: map # Consolidated filter parameter (deepObject style). Supports filtering by country_iso and resource. Examples: filter[country_iso]=US or filter[resource]=+15617819942, page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], authorization_bearer: str # Format: Bearer}\n@returns(200) {meta: map{total_results: int, total_pages: int, page_number: int, page_size: int}, data: [map]} # Successful Response\n@errors {400: Invalid request parameters, 401: Authentication required or invalid credentials}\n\n@endpoint GET /bundle_pricing/billing_bundles/{bundle_id}\n@desc Get Bundle By Id\n@required {bundle_id: str(uuid) # Unique identifier of the bundle.}\n@optional {authorization_bearer: str # Format: Bearer}\n@returns(200) {data: map{id: str(uuid), name: str, slug: str, cost_code: str, active: bool, is_public: bool, created_at: str(date), bundle_limits: [map]}} # Successful Response\n@errors {401: Authentication required or invalid credentials, 404: Resource not found}\n\n@endpoint GET /bundle_pricing/user_bundles\n@desc Get User Bundles\n@optional {filter: map # Consolidated filter parameter (deepObject style). Supports filtering by country_iso and resource. Examples: filter[country_iso]=US or filter[resource]=+15617819942, page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], authorization_bearer: str # Format: Bearer}\n@returns(200) {meta: map{total_results: int, total_pages: int, page_number: int, page_size: int}, data: [map]} # Successful Response\n@errors {400: Invalid request parameters, 401: Authentication required or invalid credentials}\n\n@endpoint POST /bundle_pricing/user_bundles/bulk\n@desc Create User Bundles\n@optional {authorization_bearer: str # Format: Bearer, idempotency_key: str(uuid) # Idempotency key for the request. Can be any UUID, but should always be unique for each request., items: [map{billing_bundle_id!: str(uuid), quantity!: int}]}\n@returns(201) {data: [map]} # Successful Response\n@errors {400: Invalid request parameters, 401: Authentication required or invalid credentials, 404: Resource not found, 422: Request cannot be processed}\n\n@endpoint GET /bundle_pricing/user_bundles/unused\n@desc Get Unused User Bundles\n@optional {filter: map # Consolidated filter parameter (deepObject style). Supports filtering by country_iso and resource. Examples: filter[country_iso]=US or filter[resource]=+15617819942, authorization_bearer: str # Format: Bearer}\n@returns(200) {data: [map]} # Successful Response\n@errors {400: Invalid request parameters, 401: Authentication required or invalid credentials}\n\n@endpoint DELETE /bundle_pricing/user_bundles/{user_bundle_id}\n@desc Deactivate User Bundle\n@required {user_bundle_id: str(uuid) # Unique identifier of the user bundle.}\n@optional {authorization_bearer: str # Format: Bearer}\n@returns(200) {data: map{id: str(uuid), active: bool, user_id: str(uuid), created_at: str(date), updated_at: str(date)?, billing_bundle: map{id: str(uuid), name: str, slug: str, cost_code: str, is_public: bool, created_at: str(date), mrc_price: num(float), currency: str, specs: [str]}, resources: [map]}} # Successful Response\n@errors {401: Authentication required or invalid credentials, 404: Resource not found, 422: Request cannot be processed}\n\n@endpoint GET /bundle_pricing/user_bundles/{user_bundle_id}\n@desc Get User Bundle by Id\n@required {user_bundle_id: str(uuid) # Unique identifier of the user bundle.}\n@optional {authorization_bearer: str # Format: Bearer}\n@returns(200) {data: map{id: str(uuid), active: bool, user_id: str(uuid), created_at: str(date), updated_at: str(date)?, billing_bundle: map{id: str(uuid), name: str, slug: str, cost_code: str, is_public: bool, created_at: str(date), mrc_price: num(float), currency: str, specs: [str]}, resources: [map]}} # Successful Response\n@errors {401: Authentication required or invalid credentials, 404: Resource not found}\n\n@endpoint GET /bundle_pricing/user_bundles/{user_bundle_id}/resources\n@desc Get User Bundle Resources\n@required {user_bundle_id: str(uuid) # Unique identifier of the user bundle.}\n@optional {authorization_bearer: str # Format: Bearer}\n@returns(200) {data: [map]} # Successful Response\n@errors {401: Authentication required or invalid credentials, 404: Resource not found}\n\n@endgroup\n\n@group call_control_applications\n@endpoint GET /call_control_applications\n@desc List call control applications\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[application_name][contains], filter[outbound.outbound_voice_profile_id], filter[leg_id], filter[application_session_id], filter[connection_id], filter[product], filter[failed], filter[from], filter[to], filter[name], filter[type], filter[occurred_at][eq/gt/gte/lt/lte], filter[status], page: map # Consolidated page parameter (deepObject style). Originally: page[after], page[before], page[limit], page[size], page[number], sort: str(created_at/connection_name/active)=created_at # Specifies the sort order for results. By default sorting direction is ascending. To have the results sorted in descending order add the  - prefix. That is:         connection_name: sorts the result by the     connection_name field in ascending order.            -connection_name: sorts the result by the     connection_name field in descending order.      If not given, results are sorted by created_at in descending order.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of call control applications.\n@errors {400: Bad request, 401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found}\n\n@endpoint POST /call_control_applications\n@desc Create a call control application\n@required {application_name: str # A user-assigned name to help manage the application., webhook_event_url: str(url) # The URL where webhooks related to this connection will be sent. Must include a scheme, such as 'https'.}\n@optional {active: bool=true # Specifies whether the connection can be used., anchorsite_override: str(Latency/Chicago, IL/Ashburn, VA/San Jose, CA/London, UK/Chennai, IN/Amsterdam, Netherlands/Toronto, Canada/Sydney, Australia)=Latency # Latency directs Telnyx to route media through the site with the lowest round-trip time to the user's connection. Telnyx calculates this time using ICMP ping messages. This can be disabled by specifying a site to handle all media., dtmf_type: str(RFC 2833/Inband/SIP INFO)=RFC 2833 # Sets the type of DTMF digits sent from Telnyx to this Connection. Note that DTMF digits sent to Telnyx will be accepted in all formats., first_command_timeout: bool=false # Specifies whether calls to phone numbers associated with this connection should hangup after timing out., first_command_timeout_secs: int=30 # Specifies how many seconds to wait before timing out a dial command., inbound: map{channel_limit: int, shaken_stir_enabled: bool, sip_subdomain: str, sip_subdomain_receive_settings: str}, outbound: map{channel_limit: int, outbound_voice_profile_id: str}, webhook_api_version: str(1/2)=1 # Determines which webhook format will be used, Telnyx API v1 or v2., webhook_event_failover_url: str(url)= # The failover URL where webhooks related to this connection will be sent if sending to the primary URL fails. Must include a scheme, such as 'https'., webhook_timeout_secs: int=null # Specifies how many seconds to wait before timing out a webhook., call_cost_in_webhooks: bool=false # Specifies if call cost webhooks should be sent for this Call Control Application., redact_dtmf_debug_logging: bool=false # When enabled, DTMF digits entered by users will be redacted in debug logs to protect PII data entered through IVR interactions.}\n@returns(201) {data: map{active: bool, anchorsite_override: str, application_name: str, created_at: str, dtmf_type: str, first_command_timeout: bool, first_command_timeout_secs: int, tags: [str], id: str, inbound: map{channel_limit: int, shaken_stir_enabled: bool, sip_subdomain: str, sip_subdomain_receive_settings: str}, outbound: map{channel_limit: int, outbound_voice_profile_id: str}, record_type: str, updated_at: str, webhook_api_version: str, webhook_event_failover_url: str(url)?, webhook_event_url: str(url), webhook_timeout_secs: int?, call_cost_in_webhooks: bool, redact_dtmf_debug_logging: bool}} # Successful response with details about a call control application.\n@errors {422: Bad Request}\n\n@endpoint DELETE /call_control_applications/{id}\n@desc Delete a call control application\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{active: bool, anchorsite_override: str, application_name: str, created_at: str, dtmf_type: str, first_command_timeout: bool, first_command_timeout_secs: int, tags: [str], id: str, inbound: map{channel_limit: int, shaken_stir_enabled: bool, sip_subdomain: str, sip_subdomain_receive_settings: str}, outbound: map{channel_limit: int, outbound_voice_profile_id: str}, record_type: str, updated_at: str, webhook_api_version: str, webhook_event_failover_url: str(url)?, webhook_event_url: str(url), webhook_timeout_secs: int?, call_cost_in_webhooks: bool, redact_dtmf_debug_logging: bool}} # Successful response with details about a call control application.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found, 422: Bad request}\n\n@endpoint GET /call_control_applications/{id}\n@desc Retrieve a call control application\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{active: bool, anchorsite_override: str, application_name: str, created_at: str, dtmf_type: str, first_command_timeout: bool, first_command_timeout_secs: int, tags: [str], id: str, inbound: map{channel_limit: int, shaken_stir_enabled: bool, sip_subdomain: str, sip_subdomain_receive_settings: str}, outbound: map{channel_limit: int, outbound_voice_profile_id: str}, record_type: str, updated_at: str, webhook_api_version: str, webhook_event_failover_url: str(url)?, webhook_event_url: str(url), webhook_timeout_secs: int?, call_cost_in_webhooks: bool, redact_dtmf_debug_logging: bool}} # Successful response with details about a call control application.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found, 422: Bad request}\n\n@endpoint PATCH /call_control_applications/{id}\n@desc Update a call control application\n@required {id: str # Identifies the resource., application_name: str # A user-assigned name to help manage the application., webhook_event_url: str(url) # The URL where webhooks related to this connection will be sent. Must include a scheme, such as 'https'.}\n@optional {call_cost_in_webhooks: bool=false # Specifies if call cost webhooks should be sent for this Call Control Application., active: bool=true # Specifies whether the connection can be used., anchorsite_override: str(Latency/Chicago, IL/Ashburn, VA/San Jose, CA/London, UK/Chennai, IN/Amsterdam, Netherlands/Toronto, Canada/Sydney, Australia)=Latency # Latency directs Telnyx to route media through the site with the lowest round-trip time to the user's connection. Telnyx calculates this time using ICMP ping messages. This can be disabled by specifying a site to handle all media., dtmf_type: str(RFC 2833/Inband/SIP INFO)=RFC 2833 # Sets the type of DTMF digits sent from Telnyx to this Connection. Note that DTMF digits sent to Telnyx will be accepted in all formats., first_command_timeout: bool=false # Specifies whether calls to phone numbers associated with this connection should hangup after timing out., first_command_timeout_secs: int=30 # Specifies how many seconds to wait before timing out a dial command., tags: [str] # Tags assigned to the Call Control Application., inbound: map{channel_limit: int, shaken_stir_enabled: bool, sip_subdomain: str, sip_subdomain_receive_settings: str}, outbound: map{channel_limit: int, outbound_voice_profile_id: str}, webhook_api_version: str(1/2)=1 # Determines which webhook format will be used, Telnyx API v1 or v2., webhook_event_failover_url: str(url)= # The failover URL where webhooks related to this connection will be sent if sending to the primary URL fails. Must include a scheme, such as 'https'., webhook_timeout_secs: int=null # Specifies how many seconds to wait before timing out a webhook., redact_dtmf_debug_logging: bool=false # When enabled, DTMF digits entered by users will be redacted in debug logs to protect PII data entered through IVR interactions.}\n@returns(200) {data: map{active: bool, anchorsite_override: str, application_name: str, created_at: str, dtmf_type: str, first_command_timeout: bool, first_command_timeout_secs: int, tags: [str], id: str, inbound: map{channel_limit: int, shaken_stir_enabled: bool, sip_subdomain: str, sip_subdomain_receive_settings: str}, outbound: map{channel_limit: int, outbound_voice_profile_id: str}, record_type: str, updated_at: str, webhook_api_version: str, webhook_event_failover_url: str(url)?, webhook_event_url: str(url), webhook_timeout_secs: int?, call_cost_in_webhooks: bool, redact_dtmf_debug_logging: bool}} # Successful response with details about a call control application.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found, 409: Conflict. Another update to this application is still in progress. Wait and retry the request later., 422: Bad request}\n\n@endgroup\n\n@group call_events\n@endpoint GET /call_events\n@desc List call events\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[application_name][contains], filter[outbound.outbound_voice_profile_id], filter[leg_id], filter[application_session_id], filter[connection_id], filter[product], filter[failed], filter[from], filter[to], filter[name], filter[type], filter[occurred_at][eq/gt/gte/lt/lte], filter[status], page: map # Consolidated page parameter (deepObject style). Originally: page[after], page[before], page[limit], page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of call events.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endgroup\n\n@group call_reasons\n@endpoint GET /call_reasons\n@desc List standard call reasons\n@optional {page[number]: int=1: any # 1-based page number. Out-of-range values return an empty page with correct meta., page[size]: int=100 # Items per page. Default `100` for this endpoint (the call-reason library is small and most callers want the whole list in one call). Maximum 250; values above are clamped to 250.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Paginated list of standard call reasons.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint POST /call_reasons/validate\n@desc Validate a list of call reasons\n@returns(200) {data: map{all_pre_approved: bool, non_approved_reasons: [str], requires_manual_vetting: bool}} # Per-string validation result.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n@example_request [\"Appointment reminders\",\"Billing inquiries\"]\n\n@endgroup\n\n@group calls\n@endpoint POST /calls\n@desc Dial\n@required {to: any # The DID or SIP URI to dial out to. Multiple DID or SIP URIs can be provided using an array of strings. For SIP URI destinations, append `;secure=true` or `;secure=srtp` to enable SRTP media encryption for that endpoint, or `;secure=dtls` to enable DTLS media encryption for that endpoint. If `media_encryption` is set to `SRTP` or `DTLS`, it takes precedence over any per-endpoint `secure` URI parameter. For a single string destination, you may append a comma followed by DTMF digits (e.g. `+18004247767,200`) to play those digits as DTMF once the called party answers — equivalent to setting `send_digits_on_answer` separately. If both are present, the explicit `send_digits_on_answer` parameter takes precedence. This shorthand is not supported when `to` is an array., from: str # The `from` number to be used as the caller id presented to the destination (`to` number). The number should be in +E164 format., connection_id: str # The ID of the Call Control App (formerly ID of the connection) to be used when dialing the destination.}\n@optional {assistant: map{id!: str, model: str, name: str, instructions: str, greeting: str, voice_settings: map, tools: [any], llm_api_key_ref: str, openai_api_key_ref: str, dynamic_variables: map, fallback_config: map, external_llm: map, mcp_servers: [map], observability_settings: map} # AI Assistant configuration. All fields except `id` are optional — the assistant's stored configuration will be used as fallback for any omitted fields., conversation_relay_config: map{url!: str, dtmf_detection: bool, greeting: str, voice: str, voice_settings: any, tts_provider: str, provider: str, structured_provider: map, language: str, languages: [map], interruptible: str, interruptible_greeting: str, interruption_settings: map, transcription_engine: str, transcription_engine_config: map, custom_parameters: map} # Starts a Conversation Relay session automatically when the answered/dialed call is answered. This embedded shape is supported on `answer` and `dial`. It uses public field names (`url`, `dtmf_detection`, `greeting`, `voice`, `language`, etc.) and maps them to the underlying Conversation Relay action. `client_state`, `tts_language`, and `transcription_language` inside this object are ignored; use the parent command's `client_state` and `command_id` fields instead., diversion: str # The `to` number of an active inbound call, in +E164 format. Telnyx checks whether there is currently an active inbound call where `to` matches this `diversion` value and `from` matches the `from` number supplied for this request. If such a call exists, the `from` number is treated as verified (since it is already on an active inbound call to you) and can be used as the caller id for this outbound call., from_display_name: str # The `from_display_name` string to be used as the caller id name (SIP From Display Name) presented to the destination (`to` number). The string should have a maximum of 128 characters, containing only letters, numbers, spaces, and -_~!.+ special characters. If ommited, the display name will be the same as the number in the `from` field., privacy: str(id/none) # Indicates the privacy level to be used for the call. When set to `id`, caller ID information (name and number) will be hidden from the called party. When set to `none` or omitted, caller ID will be shown normally., audio_url: str # The URL of a file to be played back to the callee when the call is answered. The URL can point to either a WAV or MP3 file. media_name and audio_url cannot be used together in one request., send_digits_on_answer: str # DTMF digits to send automatically after the called party answers. Useful for reaching an extension behind an IVR (e.g. `\"200\"` to dial extension 200 once the called party picks up). Allowed characters: `0-9`, `A-D`, `w` (0.5s pause), `W` (1s pause), `*`, `#`. Maximum 64 characters. When omitted, no automatic DTMF is sent. May also be supplied inline by appending `,` to `to` (e.g. `to=+18004247767,200`); if both forms are present, this explicit field takes precedence., media_name: str # The media_name of a file to be played back to the callee when the call is answered. The media_name must point to a file previously uploaded to api.telnyx.com/v2/media by the same user/organization. The file must either be a WAV or MP3 file., preferred_codecs: str # The list of comma-separated codecs in a preferred order for the forked media to be received., timeout_secs: int(int32)=30 # The number of seconds that Telnyx will wait for the call to be answered by the destination to which it is being called. If the timeout is reached before an answer is received, the call will hangup and a `call.hangup` webhook with a `hangup_cause` of `timeout` will be sent. Minimum value is 5 seconds. Maximum value is 600 seconds., retry_on_timeout: bool=true # Whether to keep trying the remaining routing paths (e.g. alternate providers/gateways) for the same destination after `timeout_secs` is reached for the current attempt. When set to `false`, reaching `timeout_secs` aborts the entire dial attempt and the `call.hangup` webhook reports a `hangup_cause` of `no_answer` instead of `timeout`., time_limit_secs: int(int32)=14400 # Sets the maximum duration of a Call Control Leg in seconds. If the time limit is reached, the call will hangup and a `call.hangup` webhook with a `hangup_cause` of `time_limit` will be sent. For example, by setting a time limit of 120 seconds, a Call Leg will be automatically terminated two minutes after being answered. The default time limit is 14400 seconds or 4 hours and this is also the maximum allowed call length., answering_machine_detection: str(premium/detect/detect_beep/detect_words/greeting_end/disabled)=disabled # Enables Answering Machine Detection. Telnyx offers Premium and Standard detections. With Premium detection, when a call is answered, Telnyx runs real-time detection and sends a `call.machine.premium.detection.ended` webhook with one of the following results: `human_residence`, `human_business`, `machine`, `silence` or `fax_detected`. If we detect a beep, we also send a `call.machine.premium.greeting.ended` webhook with the result of `beep_detected`. If we detect a beep before `call.machine.premium.detection.ended` we only send `call.machine.premium.greeting.ended`, and if we detect a beep after `call.machine.premium.detection.ended`, we send both webhooks. With Standard detection, when a call is answered, Telnyx runs real-time detection to determine if it was picked up by a human or a machine and sends an `call.machine.detection.ended` webhook with the analysis result. If `greeting_end` or `detect_words` is used and a `machine` is detected, you will receive another `call.machine.greeting.ended` webhook when the answering machine greeting ends with a beep or silence. If `detect_beep` is used, you will only receive `call.machine.greeting.ended` if a beep is detected., answering_machine_detection_config: map{total_analysis_time_millis: int(int32), beep_detection_profile: str, beep_min_frequency_hz: int(int32), beep_max_frequency_hz: int(int32), beep_min_tone_duration_millis: int(int32), beep_spectral_confirmation: bool, beep_spectral_window_millis: int(int32), beep_spectral_min_purity: num, beep_spectral_reject_fax_cng: bool, after_greeting_silence_millis: int(int32), between_words_silence_millis: int(int32), greeting_duration_millis: int(int32), initial_silence_millis: int(int32), maximum_number_of_words: int(int32), maximum_word_length_millis: int(int32), silence_threshold: int(int32), greeting_total_analysis_time_millis: int(int32), greeting_silence_duration_millis: int(int32)} # Optional configuration parameters to modify 'answering_machine_detection' performance. Only `total_analysis_time_millis` and `greeting_duration_millis` parameters are applicable when `premium` is selected as answering_machine_detection., deepfake_detection: map{enabled!: bool, timeout: int(int32), rtp_timeout: int(int32)} # Enables deepfake detection on the call. When enabled, audio from the remote party is streamed to a detection service that analyzes whether the voice is AI-generated. Results are delivered via the `call.deepfake_detection.result` webhook., conference_config: map{id: str(uuid), conference_name: str, early_media: bool, end_conference_on_exit: bool, soft_end_conference_on_exit: bool, hold: bool, hold_audio_url: str, hold_media_name: str, mute: bool, start_conference_on_enter: bool, start_conference_on_create: bool, supervisor_role: str, whisper_call_control_ids: [str], beep_enabled: str} # Optional configuration parameters to dial new participant into a conference., custom_headers: [map{name!: str, value!: str}] # Custom headers to be added to the SIP INVITE., billing_group_id: str(uuid) # Use this field to set the Billing Group ID for the call. Must be a valid and existing Billing Group ID., client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore others Dial commands with the same `command_id`., link_to: str # Use another call's control id for sharing the same call session id, bridge_intent: bool=false # Indicates the intent to bridge this call with the call specified in link_to. When bridge_intent is true, link_to becomes required and the from number will be overwritten by the from number from the linked call., bridge_on_answer: bool=false # Whether to automatically bridge answered call to the call specified in link_to. When bridge_on_answer is true, link_to becomes required., prevent_double_bridge: bool=false # Prevents bridging and hangs up the call if the target is already bridged. Disabled by default., park_after_unbridge: str # If supplied with the value `self`, the current leg will be parked after unbridge. If not set, the default behavior is to hang up the leg. When park_after_unbridge is set, link_to becomes required., media_encryption: str(disabled/SRTP/DTLS)=disabled # Defines whether media should be encrypted on the call. For SIP URI destinations, media encryption can also be requested per endpoint with the `secure` URI parameter: `;secure=true` or `;secure=srtp` enables SRTP, and `;secure=dtls` enables DTLS. This parameter, when set to `SRTP` or `DTLS`, takes precedence over the per-endpoint `secure` value., sip_auth_username: str # SIP Authentication username used for SIP challenges., sip_auth_password: str # SIP Authentication password used for SIP challenges., sip_headers: [map{name!: str, value!: str}] # SIP headers to be added to the SIP INVITE request. Currently only User-to-User header is supported., sip_transport_protocol: str(UDP/TCP/TLS)=UDP # Defines SIP transport protocol to be used on the call., sound_modifications: map{pitch: num(float), semitone: num(float), octaves: num(float), track: str} # Use this field to modify sound effects, for example adjust the pitch., stream_url: str # The destination WebSocket address where the stream is going to be delivered., stream_track: str(inbound_track/outbound_track/both_tracks)=inbound_track # Specifies which track should be streamed., stream_codec: str(PCMU/PCMA/G722/OPUS/AMR-WB/L16/default)=default # Specifies the codec to be used for the streamed audio. When set to 'default' or when transcoding is not possible, the codec from the call will be used., stream_bidirectional_mode: str(mp3/rtp)=mp3 # Configures method of bidirectional streaming (mp3, rtp)., stream_bidirectional_codec: str(PCMU/PCMA/G722/OPUS/AMR-WB/L16)=PCMU # Indicates codec for bidirectional streaming RTP payloads. Used only with stream_bidirectional_mode=rtp. Case sensitive., stream_bidirectional_target_legs: str(both/self/opposite)=opposite # Specifies which call legs should receive the bidirectional stream audio., stream_bidirectional_sampling_rate: int(8000/16000/22050/24000/48000)=8000 # Audio sampling rate., stream_establish_before_call_originate: bool=false # Establish websocket connection before dialing the destination. This is useful for cases where the websocket connection takes a long time to establish., send_silence_when_idle: bool=false # Generate silence RTP packets when no transmission available., webhook_url: str # Use this field to override the URL for which Telnyx will send subsequent webhooks to for this call., webhook_url_method: str(POST/GET)=POST # HTTP request type used for `webhook_url`., webhook_urls: map # A map of event types to arrays of webhook URLs. When an event of the specified type occurs, the webhook URLs associated with that event type will be called instead of the default webhook URL. Events not mapped here will use the default webhook URL., webhook_urls_method: str(POST/GET)=POST # HTTP request method to invoke `webhook_urls`., webhook_retries_policies: map # A map of event types to retry policies. Each retry policy contains an array of `retries_ms` specifying the delays between retry attempts in milliseconds. Maximum 5 retries, total delay cannot exceed 60 seconds., record: str # Start recording automatically after an event. Disabled by default., record_channels: str(single/dual)=dual # Defines which channel should be recorded ('single' or 'dual') when `record` is specified., record_format: str(wav/mp3)=mp3 # Defines the format of the recording ('wav' or 'mp3') when `record` is specified., record_max_length: int(int32)=0 # Defines the maximum length for the recording in seconds when `record` is specified. The minimum value is 0. The maximum value is 43200. The default value is 0 (infinite)., record_timeout_secs: int(int32)=0 # The number of seconds that Telnyx will wait for the recording to be stopped if silence is detected when `record` is specified. The timer only starts when the speech is detected. Please note that call transcription is used to detect silence and the related charge will be applied. The minimum value is 0. The default value is 0 (infinite)., record_track: str(both/inbound/outbound)=both # The audio track to be recorded. Can be either `both`, `inbound` or `outbound`. If only single track is specified (`inbound`, `outbound`), `channels` configuration is ignored and it will be recorded as mono (single channel)., record_trim: str # When set to `trim-silence`, silence will be removed from the beginning and end of the recording., record_custom_file_name: str # The custom recording file name to be used instead of the default `call_leg_id`. Telnyx will still add a Unix timestamp suffix., supervise_call_control_id: str # The call leg which will be supervised by the new call., supervisor_role: str(barge/whisper/monitor)=barge # The role of the supervisor call. 'barge' means that supervisor call hears and is being heard by both ends of the call (caller & callee). 'whisper' means that only supervised_call_control_id hears supervisor but supervisor can hear everything. 'monitor' means that nobody can hear supervisor call, but supervisor can hear everything on the call., enable_dialogflow: bool=false # Enables Dialogflow for the current call. The default value is false., dialogflow_config: map{analyze_sentiment: bool, partial_automated_agent_reply: bool}, transcription: bool=false # Enable transcription upon call answer. The default value is false., transcription_config: map{transcription_engine: str, transcription_engine_config: any, client_state: str, transcription_tracks: str, command_id: str}, sip_region: str(US/Europe/Canada/Australia/Middle East)=US # Defines the SIP region to be used for the call., stream_auth_token: str # An authentication token to be sent as part of the WebSocket connection when using streaming. Maximum length is 4000 characters., route_to_mobile: bool=false # When set to true, routes the call directly to the mobile device associated with the destination Telnyx Mobile number, bypassing Inbound Calls Interception configured in the Telnyx Portal under Mobile Numbers → select the number → Voice → Call Interception. Use this when transferring an intercepted call to the mobile device to prevent the call from being intercepted again. Defaults to false.}\n@returns(200) {data: map{record_type: str, call_session_id: str, call_leg_id: str, call_control_id: str, is_alive: bool, client_state: str, call_duration: int, recording_id: str(uuid), start_time: str, end_time: str}} # Successful response with details about a call status that includes recording_id.\n@errors {400: Bad request. The request was invalid or cannot be served. Common causes include: audio file download failures, attempting to delete non-empty queues, invalid characters in the request, or character encoding errors., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations., 429: Too many requests. The number of dial attempts per second allowed for your account has been exceeded. Reduce the rate of outbound dial attempts and retry., 500: Internal server error. An unexpected error occurred on the server. This is typically returned for unhandled exceptions or system failures., 503: Service unavailable. The service is temporarily unavailable. This may occur during maintenance or when the service is overloaded.}\n\n@endpoint GET /calls/{call_control_id}\n@desc Retrieve a call status\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@returns(200) {data: map{record_type: str, call_session_id: str, call_leg_id: str, call_control_id: str, is_alive: bool, client_state: str, call_duration: int, start_time: str, end_time: str}} # Successful response with details about a call status.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/ai_assistant_add_messages\n@desc Add messages to AI Assistant\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`., messages: [any] # The messages to add to the conversation., trigger_response: bool=false # When `true`, the injected messages immediately trigger an assistant response/turn instead of waiting for the next natural turn or idle timeout. This may interrupt a user who is still speaking.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/ai_assistant_join\n@desc Join AI Assistant Conversation\n@required {call_control_id: str # Unique identifier and token for controlling the call, conversation_id: str # The ID of the AI assistant conversation to join., participant: map{id!: str, role!: str, name: str, on_hangup: str}}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`.}\n@returns(200) {data: map{result: str, conversation_id: str(uuid)}} # Successful response upon making a call control command that includes conversation_id.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/ai_assistant_start\n@desc Start AI Assistant\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {assistant: map{id!: str, model: str, name: str, instructions: str, greeting: str, voice_settings: map, tools: [any], llm_api_key_ref: str, openai_api_key_ref: str, dynamic_variables: map, fallback_config: map, external_llm: map, mcp_servers: [map], observability_settings: map} # AI Assistant configuration. All fields except `id` are optional — the assistant's stored configuration will be used as fallback for any omitted fields., greeting: str # Text that will be played when the assistant starts, if none then nothing will be played when the assistant starts. The greeting can be text for any voice or SSML for `AWS.Polly.` voices. There is a 3,000 character limit., interruption_settings: map{enable: bool} # Settings for handling user interruptions during assistant speech, transcription: map{model: str, language: str} # The settings associated with speech to text for the voice assistant. This is only relevant if the assistant uses a text-to-text language model. Any assistant using a model with native audio support (e.g. `fixie-ai/ultravox-v0_4`) will ignore this field., message_history: [any]= # A list of messages to seed the conversation history before the assistant starts. Follows the same message format as the `ai_assistant_add_messages` command., send_message_history_updates: bool=false # When `true`, a `call.ai_gather.message_history_updated` webhook carrying the full message history is sent each time the conversation message history is updated. The assistant's own `telephony_settings.send_message_history_updates` overrides this value when it is set., participants: [map{id!: str, role!: str, name: str, on_hangup: str}]= # A list of participants to add to the conversation when it starts., client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`.}\n@returns(200) {data: map{result: str, conversation_id: str(uuid)}} # Successful response upon making a call control command that includes conversation_id.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/ai_assistant_stop\n@desc Stop AI Assistant\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/answer\n@desc Answer call\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {assistant: map{id!: str, model: str, name: str, instructions: str, greeting: str, voice_settings: map, tools: [any], llm_api_key_ref: str, openai_api_key_ref: str, dynamic_variables: map, fallback_config: map, external_llm: map, mcp_servers: [map], observability_settings: map} # AI Assistant configuration. All fields except `id` are optional — the assistant's stored configuration will be used as fallback for any omitted fields., conversation_relay_config: map{url!: str, dtmf_detection: bool, greeting: str, voice: str, voice_settings: any, tts_provider: str, provider: str, structured_provider: map, language: str, languages: [map], interruptible: str, interruptible_greeting: str, interruption_settings: map, transcription_engine: str, transcription_engine_config: map, custom_parameters: map} # Starts a Conversation Relay session automatically when the answered/dialed call is answered. This embedded shape is supported on `answer` and `dial`. It uses public field names (`url`, `dtmf_detection`, `greeting`, `voice`, `language`, etc.) and maps them to the underlying Conversation Relay action. `client_state`, `tts_language`, and `transcription_language` inside this object are ignored; use the parent command's `client_state` and `command_id` fields instead., billing_group_id: str(uuid) # Use this field to set the Billing Group ID for the call. Must be a valid and existing Billing Group ID., client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`., custom_headers: [map{name!: str, value!: str}] # Custom headers to be added to the SIP INVITE response., preferred_codecs: str # The list of comma-separated codecs in a preferred order for the forked media to be received., sip_headers: [map{name!: str, value!: str}] # SIP headers to be added to the SIP INVITE response. Currently only User-to-User header is supported., sound_modifications: map{pitch: num(float), semitone: num(float), octaves: num(float), track: str} # Use this field to modify sound effects, for example adjust the pitch., stream_url: str # The destination WebSocket address where the stream is going to be delivered., stream_track: str(inbound_track/outbound_track/both_tracks)=inbound_track # Specifies which track should be streamed., stream_codec: str(PCMU/PCMA/G722/OPUS/AMR-WB/L16/default)=default # Specifies the codec to be used for the streamed audio. When set to 'default' or when transcoding is not possible, the codec from the call will be used., stream_bidirectional_mode: str(mp3/rtp)=mp3 # Configures method of bidirectional streaming (mp3, rtp)., stream_bidirectional_codec: str(PCMU/PCMA/G722/OPUS/AMR-WB/L16)=PCMU # Indicates codec for bidirectional streaming RTP payloads. Used only with stream_bidirectional_mode=rtp. Case sensitive., stream_bidirectional_target_legs: str(both/self/opposite)=opposite # Specifies which call legs should receive the bidirectional stream audio., send_silence_when_idle: bool=false # Generate silence RTP packets when no transmission available., webhook_url: str # Use this field to override the URL for which Telnyx will send subsequent webhooks to for this call., webhook_url_method: str(POST/GET)=POST # HTTP request type used for `webhook_url`., transcription: bool=false # Enable transcription upon call answer. The default value is false., transcription_config: map{transcription_engine: str, transcription_engine_config: any, client_state: str, transcription_tracks: str, command_id: str}, record: str # Start recording automatically after an event. Disabled by default., record_channels: str(single/dual)=dual # Defines which channel should be recorded ('single' or 'dual') when `record` is specified., record_format: str(wav/mp3)=mp3 # Defines the format of the recording ('wav' or 'mp3') when `record` is specified., record_max_length: int(int32)=0 # Defines the maximum length for the recording in seconds when `record` is specified. The minimum value is 0. The maximum value is 43200. The default value is 0 (infinite)., record_timeout_secs: int(int32)=0 # The number of seconds that Telnyx will wait for the recording to be stopped if silence is detected when `record` is specified. The timer only starts when the speech is detected. Please note that call transcription is used to detect silence and the related charge will be applied. The minimum value is 0. The default value is 0 (infinite)., record_track: str(both/inbound/outbound)=both # The audio track to be recorded. Can be either `both`, `inbound` or `outbound`. If only single track is specified (`inbound`, `outbound`), `channels` configuration is ignored and it will be recorded as mono (single channel)., record_trim: str # When set to `trim-silence`, silence will be removed from the beginning and end of the recording., record_custom_file_name: str # The custom recording file name to be used instead of the default `call_leg_id`. Telnyx will still add a Unix timestamp suffix., webhook_urls: map # A map of event types to arrays of webhook URLs. When an event of the specified type occurs, the webhook URLs associated with that event type will be called instead of `webhook_url`. Events not mapped here will use the default `webhook_url`., webhook_urls_method: str(POST/GET)=POST # HTTP request method to invoke `webhook_urls`., webhook_retries_policies: map # A map of event types to retry policies. Each retry policy contains an array of `retries_ms` specifying the delays between retry attempts in milliseconds. Maximum 5 retries, total delay cannot exceed 60 seconds., deepfake_detection: map{enabled!: bool, timeout: int(int32), rtp_timeout: int(int32)} # Enables deepfake detection on the call. When enabled, audio from the remote party is streamed to a detection service that analyzes whether the voice is AI-generated. Results are delivered via the `call.deepfake_detection.result` webhook.}\n@returns(200) {data: map{result: str, recording_id: str(uuid)}} # Successful response upon making a call control command that includes recording_id.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/bridge\n@desc Bridge calls\n@required {call_control_id: str # Unique identifier and token for controlling the call, call_control_id: str # The Call Control ID of the call you want to bridge with, can't be used together with queue parameter or video_room_id parameter.}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`., queue: str # The name of the queue you want to bridge with, can't be used together with call_control_id parameter or video_room_id parameter. Bridging with a queue means bridging with the first call in the queue. The call will always be removed from the queue regardless of whether bridging succeeds. Returns an error when the queue is empty., video_room_id: str(uuid) # The ID of the video room you want to bridge with, can't be used together with call_control_id parameter or queue parameter., video_room_context: str # The additional parameter that will be passed to the video conference. It is a text field and the user can decide how to use it. For example, you can set the participant name or pass JSON text. It can be used only with video_room_id parameter., prevent_double_bridge: bool=false # When set to `true`, it prevents bridging if the target call is already bridged to another call. Disabled by default., park_after_unbridge: str # Specifies behavior after the bridge ends (i.e. the opposite leg either hangs up or is transferred). If supplied with the value `self`, the current leg will be parked after unbridge. If not set, the default behavior is to hang up the leg., play_ringtone: bool=false # Specifies whether to play a ringtone if the call you want to bridge with has not yet been answered., ringtone: str(at/au/be/bg/br/ch/cl/cn/cz/de/dk/ee/es/fi/fr/gr/hu/il/in/it/jp/lt/mx/my/nl/no/nz/ph/pl/pt/ru/se/sg/th/tw/uk/us-old/us/ve/za)=us # Specifies which country ringtone to play when `play_ringtone` is set to `true`. If not set, the US ringtone will be played., record: str # Start recording automatically after an event. Disabled by default., record_channels: str(single/dual)=dual # Defines which channel should be recorded ('single' or 'dual') when `record` is specified., record_format: str(wav/mp3)=mp3 # Defines the format of the recording ('wav' or 'mp3') when `record` is specified., record_max_length: int(int32)=0 # Defines the maximum length for the recording in seconds when `record` is specified. The minimum value is 0. The maximum value is 43200. The default value is 0 (infinite)., record_timeout_secs: int(int32)=0 # The number of seconds that Telnyx will wait for the recording to be stopped if silence is detected when `record` is specified. The timer only starts when the speech is detected. Please note that call transcription is used to detect silence and the related charge will be applied. The minimum value is 0. The default value is 0 (infinite)., record_track: str(both/inbound/outbound)=both # The audio track to be recorded. Can be either `both`, `inbound` or `outbound`. If only single track is specified (`inbound`, `outbound`), `channels` configuration is ignored and it will be recorded as mono (single channel)., record_trim: str # When set to `trim-silence`, silence will be removed from the beginning and end of the recording., record_custom_file_name: str # The custom recording file name to be used instead of the default `call_leg_id`. Telnyx will still add a Unix timestamp suffix., mute_dtmf: str(none/both/self/opposite)=none # When enabled, DTMF tones are not passed to the call participant. The webhooks containing the DTMF information will be sent., hold_after_unbridge: bool # Specifies behavior after the bridge ends. If set to `true`, the current leg will be put on hold after unbridge instead of being hung up.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint PUT /calls/{call_control_id}/actions/client_state_update\n@desc Update client state\n@required {call_control_id: str # Unique identifier and token for controlling the call, client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/conversation_relay_start\n@desc Start Conversation Relay\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {conversation_relay_settings: map{url!: str, dtmf_detection: bool, interruptible: str, interruptible_greeting: str, languages: [map]} # Conversation Relay connection settings. This object can provide `url`, `dtmf_detection`, `interruptible`, `interruptible_greeting`, and `languages`. Top-level aliases override nested values when both are present., url: str # Public alias for `conversation_relay_url`. Must start with `ws://` or `wss://`. If both are present, this value wins., dtmf_detection: bool=false # Public alias for `conversation_relay_dtmf_detection`. If both are present, this value wins., conversation_relay_url: str # WebSocket URL for your Conversation Relay server. Must start with `ws://` or `wss://`., conversation_relay_dtmf_detection: bool=false # Enable DTMF detection for the relay session., voice: str=Telnyx.KokoroTTS.af # The voice to be used by the voice assistant. Currently we support ElevenLabs, Telnyx and AWS voices.   **Supported Providers:** - **AWS:** Use `AWS.Polly.` (e.g., `AWS.Polly.Joanna`). For neural voices, which provide more realistic, human-like speech, append `-Neural` to the `VoiceId` (e.g., `AWS.Polly.Joanna-Neural`). Check the [available voices](https://docs.aws.amazon.com/polly/latest/dg/available-voices.html) for compatibility. - **Azure:** Use `Azure.. (e.g. Azure.en-CA-ClaraNeural, Azure.en-CA-LiamNeural, Azure.en-US-BrianMultilingualNeural, Azure.en-US-Ava:DragonHDLatestNeural. For a complete list of voices, go to [Azure Voice Gallery](https://speech.microsoft.com/portal/voicegallery).) - **ElevenLabs:** Use `ElevenLabs..` (e.g., `ElevenLabs.BaseModel.John`). The `ModelId` part is optional. To use ElevenLabs, you must provide your ElevenLabs API key as an integration secret under `\"voice_settings\": {\"api_key_ref\": \"\"}`. See [integration secrets documentation](https://developers.telnyx.com/api/secrets-manager/integration-secrets/create-integration-secret) for details. Check [available voices](https://elevenlabs.io/docs/api-reference/get-voices).  - **Telnyx:** Use `Telnyx..` - **Inworld:** Use `Inworld..` (e.g., `Inworld.Mini.Loretta`, `Inworld.Max.Oliver`, `Inworld.TTS2.Loretta`). Supported models: `Mini`, `Max`, `TTS2`. - **Fish Audio:** Use `FishAudio..` (e.g., `FishAudio.s2.1-pro.`). Supported models: `s2.1-pro`, `s2-pro`, `s1`. `VoiceId` is a Fish Voice-Library reference ID. - **Soniox:** Use `Soniox..` (e.g., `Soniox.tts-rt-v2.Emma`). Supported model: `tts-rt-v2`. Browse the catalog via the [Voices API](https://developers.telnyx.com/api-reference/text-to-speech-commands/list-available-voices). Every voice speaks all supported languages; set `language` to the two-letter ISO 639-1 code of the text, for example `it`. SSML is not supported. Use `voice_settings` to configure `speed` (0.7 to 1.3) and `reduce_silence`. - **xAI:** Use `xAI.` (e.g., `xAI.eve`). Available voices: `eve`, `ara`, `rex`, `sal`, `leo`. - **Humain:** Use `Humain.` (e.g., `Humain.sara-ar`). Available voices: `sara-en`, `abdulaziz-en`, `sara-ar`, `abdulaziz-ar`, `nourah-ar`, `abdullah-ar`. Native Arabic (Saudi dialect) and English voices only — no `ModelId` segment., voice_settings: any # The settings associated with the voice selected, greeting: str # Text played when the relay session starts., language: str=en # Default language for the relay session. This value is used for both text-to-speech and speech recognition., languages: [map{language!: str, tts_provider: str, voice: str, voice_settings: any, transcription_engine: str, transcription_engine_config: map, transcription_provider: str, speech_model: str}] # Per-language TTS and transcription settings., interruption_settings: map{enable: bool, interruptible: str, interruptible_greeting: str, welcome_greeting_interruptible: str} # Settings for handling caller interruptions during Conversation Relay speech., transcription: map # Not supported for Conversation Relay start requests. Use `transcription_engine` and `transcription_engine_config` instead., assistant: map{dynamic_variables: map} # Custom parameters for the Conversation Relay session. Pass key-value data as `assistant.dynamic_variables` to make it available to the relay session., client_state: str # Use this field to add state to subsequent webhooks. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`., tts_provider: str # Text-to-speech provider. If omitted, Telnyx derives it from `voice` or `provider`., provider: str # Structured voice provider. Must be supplied together with `structured_provider`., structured_provider: map # Provider-specific structured voice settings. Must be supplied together with `provider`; Telnyx sends the value as the nested provider configuration for Conversation Relay., transcription_engine: str(Google/Telnyx/Deepgram/Azure/xAI/AssemblyAI/Speechmatics/Soniox/A/B)=Google # Engine to use for speech recognition. Legacy values `A` - `Google`, `B` - `Telnyx` are supported for backward compatibility. For Conversation Relay, use this field with `transcription_engine_config`; the `transcription` object is not supported., transcription_engine_config: map # Engine-specific transcription settings for Conversation Relay. This accepts the same provider-specific options used by the Call Transcription Start command, such as `transcription_model`, without requiring the engine discriminator to be repeated inside this object., interruptible: str(none/any/speech/dtmf)=any # Controls when caller input can interrupt assistant speech. `any` allows speech or DTMF interruptions; `none` disables interruptions; `speech` allows speech only; `dtmf` allows DTMF only., interruptible_greeting: str(none/any/speech/dtmf)=any # Controls when caller input can interrupt assistant speech. `any` allows speech or DTMF interruptions; `none` disables interruptions; `speech` allows speech only; `dtmf` allows DTMF only., custom_parameters: map # Custom key-value parameters forwarded to the relay session as `assistant.dynamic_variables`. If `assistant.dynamic_variables` is also present, these values are merged in.}\n@returns(200) {data: map{result: str, conversation_relay_id: str}} # Successful response upon starting Conversation Relay.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/conversation_relay_stop\n@desc Stop Conversation Relay\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {client_state: str # Use this field to add state to subsequent webhooks. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/enqueue\n@desc Enqueue call\n@required {call_control_id: str # Unique identifier and token for controlling the call, queue_name: str # The name of the queue the call should be put in. If a queue with a given name doesn't exist yet it will be created.}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`., max_wait_time_secs: int # The number of seconds after which the call will be removed from the queue., max_size: int=100 # The maximum number of calls allowed in the queue at a given time. Can't be modified for an existing queue., keep_after_hangup: bool=false # If set to true, the call will remain in the queue after hangup. In this case bridging to such call will fail with necessary information needed to re-establish the call.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/fork_start\n@desc Forking start\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {rx: str # The network target, , where the call's incoming RTP media packets should be forwarded., stream_type: str=decrypted # Optionally specify a media type to stream. If `decrypted` selected, Telnyx will decrypt incoming SIP media before forking to the target. `rx` and `tx` are required fields if `decrypted` selected., tx: str # The network target, , where the call's outgoing RTP media packets should be forwarded., client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/fork_stop\n@desc Forking stop\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`., stream_type: str(raw/decrypted)=raw # Optionally specify a `stream_type`. This should match the `stream_type` that was used in `fork_start` command to properly stop the fork.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/gather\n@desc Gather\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {minimum_digits: int(int32)=1 # The minimum number of digits to fetch. This parameter has a minimum value of 1., maximum_digits: int(int32)=128 # The maximum number of digits to fetch. This parameter has a maximum value of 128., timeout_millis: int(int32)=60000 # The number of milliseconds to wait to complete the request., inter_digit_timeout_millis: int(int32)=5000 # The number of milliseconds to wait for input between digits., initial_timeout_millis: int(int32)=5000 # The number of milliseconds to wait for the first DTMF., terminating_digit: str=# # The digit used to terminate input if fewer than `maximum_digits` digits have been gathered. Set to an empty string to disable the terminating digit entirely, so that a digit such as `#` can be collected as input per `valid_digits`., valid_digits: str=0123456789#* # A list of all digits accepted as valid., gather_id: str # An id that will be sent back in the corresponding `call.gather.ended` webhook. Will be randomly generated if not specified., client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/gather_stop\n@desc Gather stop\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/gather_using_ai\n@desc Gather using AI\n@required {call_control_id: str # Unique identifier and token for controlling the call, parameters: map # The parameters described as a JSON Schema object that needs to be gathered by the voice assistant. See the [JSON Schema reference](https://json-schema.org/understanding-json-schema) for documentation about the format}\n@optional {assistant: map{model: str, instructions: str, openai_api_key_ref: str, tools: [any]} # Assistant configuration including choice of LLM, custom instructions, and tools., transcription: map{model: str, language: str} # The settings associated with speech to text for the voice assistant. This is only relevant if the assistant uses a text-to-text language model. Any assistant using a model with native audio support (e.g. `fixie-ai/ultravox-v0_4`) will ignore this field., language: any, voice: str=Telnyx.KokoroTTS.af # The voice to be used by the voice assistant. Currently we support ElevenLabs, Telnyx and AWS voices.   **Supported Providers:** - **AWS:** Use `AWS.Polly.` (e.g., `AWS.Polly.Joanna`). For neural voices, which provide more realistic, human-like speech, append `-Neural` to the `VoiceId` (e.g., `AWS.Polly.Joanna-Neural`). Check the [available voices](https://docs.aws.amazon.com/polly/latest/dg/available-voices.html) for compatibility. - **Azure:** Use `Azure.. (e.g. Azure.en-CA-ClaraNeural, Azure.en-CA-LiamNeural, Azure.en-US-BrianMultilingualNeural, Azure.en-US-Ava:DragonHDLatestNeural. For a complete list of voices, go to [Azure Voice Gallery](https://speech.microsoft.com/portal/voicegallery).) - **ElevenLabs:** Use `ElevenLabs..` (e.g., `ElevenLabs.BaseModel.John`). The `ModelId` part is optional. To use ElevenLabs, you must provide your ElevenLabs API key as an integration secret under `\"voice_settings\": {\"api_key_ref\": \"\"}`. See [integration secrets documentation](https://developers.telnyx.com/api/secrets-manager/integration-secrets/create-integration-secret) for details. Check [available voices](https://elevenlabs.io/docs/api-reference/get-voices).  - **Telnyx:** Use `Telnyx..` - **Inworld:** Use `Inworld..` (e.g., `Inworld.Mini.Loretta`, `Inworld.Max.Oliver`, `Inworld.TTS2.Loretta`). Supported models: `Mini`, `Max`, `TTS2`. - **Fish Audio:** Use `FishAudio..` (e.g., `FishAudio.s2.1-pro.`). Supported models: `s2.1-pro`, `s2-pro`, `s1`. `VoiceId` is a Fish Voice-Library reference ID. - **Soniox:** Use `Soniox..` (e.g., `Soniox.tts-rt-v2.Emma`). Supported model: `tts-rt-v2`. Browse the catalog via the [Voices API](https://developers.telnyx.com/api-reference/text-to-speech-commands/list-available-voices). Every voice speaks all supported languages; set `language` to the two-letter ISO 639-1 code of the text, for example `it`. SSML is not supported. Use `voice_settings` to configure `speed` (0.7 to 1.3) and `reduce_silence`. - **xAI:** Use `xAI.` (e.g., `xAI.eve`). Available voices: `eve`, `ara`, `rex`, `sal`, `leo`. - **Humain:** Use `Humain.` (e.g., `Humain.sara-ar`). Available voices: `sara-en`, `abdulaziz-en`, `sara-ar`, `abdulaziz-ar`, `nourah-ar`, `abdullah-ar`. Native Arabic (Saudi dialect) and English voices only — no `ModelId` segment., voice_settings: any # The settings associated with the voice selected, greeting: str # Text that will be played when the gathering starts, if none then nothing will be played when the gathering starts. The greeting can be text for any voice or SSML for `AWS.Polly.` voices. There is a 3,000 character limit., send_partial_results: bool # Default is `false`. If set to `true`, the voice assistant will send partial results via the `call.ai_gather.partial_results` callback in real time as individual fields are gathered. If set to `false`, the voice assistant will only send the final result via the `call.ai_gather.ended` callback., send_message_history_updates: bool # Default is `false`. If set to `true`, the voice assistant will send updates to the message history via the `call.ai_gather.message_history_updated` callback in real time as the message history is updated., message_history: [map{content: str, role: str}] # The message history you want the voice assistant to be aware of, this can be useful to keep the context of the conversation, or to pass additional information to the voice assistant., client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`., interruption_settings: map{enable: bool} # Settings for handling user interruptions during assistant speech, user_response_timeout_ms: int=10000 # The maximum time in milliseconds to wait for user response before timing out., gather_ended_speech: str # Text that will be played when the gathering has finished. There is a 3,000 character limit.}\n@returns(200) {data: map{result: str, conversation_id: str(uuid)}} # Successful response upon making a call control command that includes conversation_id.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/gather_using_audio\n@desc Gather using audio\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {audio_url: str # The URL of a file to be played back at the beginning of each prompt. The URL can point to either a WAV or MP3 file. media_name and audio_url cannot be used together in one request., media_name: str # The media_name of a file to be played back at the beginning of each prompt. The media_name must point to a file previously uploaded to api.telnyx.com/v2/media by the same user/organization. The file must either be a WAV or MP3 file., invalid_audio_url: str # The URL of a file to play when digits don't match the `valid_digits` parameter or the number of digits is not between `min` and `max`. The URL can point to either a WAV or MP3 file. invalid_media_name and invalid_audio_url cannot be used together in one request., invalid_media_name: str # The media_name of a file to be played back when digits don't match the `valid_digits` parameter or the number of digits is not between `min` and `max`. The media_name must point to a file previously uploaded to api.telnyx.com/v2/media by the same user/organization. The file must either be a WAV or MP3 file., minimum_digits: int(int32)=1 # The minimum number of digits to fetch. This parameter has a minimum value of 1., maximum_digits: int(int32)=128 # The maximum number of digits to fetch. This parameter has a maximum value of 128., maximum_tries: int(int32)=3 # The maximum number of times the file should be played if there is no input from the user on the call., timeout_millis: int(int32)=60000 # The number of milliseconds to wait for a DTMF response after file playback ends before a replaying the sound file., terminating_digit: str=# # The digit used to terminate input if fewer than `maximum_digits` digits have been gathered. Set to an empty string to disable the terminating digit entirely, so that a digit such as `#` can be collected as input per `valid_digits`., valid_digits: str=0123456789#* # A list of all digits accepted as valid., inter_digit_timeout_millis: int(int32)=5000 # The number of milliseconds to wait for input between digits., client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/gather_using_speak\n@desc Gather using speak\n@required {call_control_id: str # Unique identifier and token for controlling the call, payload: str # The text or SSML to be converted into speech. There is a 3,000 character limit., voice: str # Specifies the voice used in speech synthesis.  - Define voices using the format `..`. Specifying only the provider will give default values for voice_id and model_id.   **Supported Providers:** - **AWS:** Use `AWS.Polly.` (e.g., `AWS.Polly.Joanna`). For neural voices, which provide more realistic, human-like speech, append `-Neural` to the `VoiceId` (e.g., `AWS.Polly.Joanna-Neural`). Check the [available voices](https://docs.aws.amazon.com/polly/latest/dg/available-voices.html) for compatibility. - **Azure:** Use `Azure.` (e.g., `Azure.en-CA-ClaraNeural`, `Azure.en-US-BrianMultilingualNeural`, `Azure.en-US-Ava:DragonHDLatestNeural`). For a complete list of voices, go to [Azure Voice Gallery](https://speech.microsoft.com/portal/voicegallery). Use `voice_settings` to configure custom deployments, regions, or API keys. - **ElevenLabs:** Use `ElevenLabs..` (e.g., `ElevenLabs.eleven_multilingual_v2.21m00Tcm4TlvDq8ikWAM`). The `ModelId` part is optional. To use ElevenLabs, you must provide your ElevenLabs API key as an integration identifier secret in `\"voice_settings\": {\"api_key_ref\": \"\"}`. See [integration secrets documentation](https://developers.telnyx.com/api/secrets-manager/integration-secrets/create-integration-secret) for details. Check [available voices](https://elevenlabs.io/docs/api-reference/get-voices). - **Telnyx:** Use `Telnyx..` (e.g., `Telnyx.KokoroTTS.af`). Use `voice_settings` to configure voice_speed and other synthesis parameters. `Bayan` provides Arabic (multiple dialects) and English voices (e.g., `Telnyx.Bayan.Ahmed`, `Telnyx.Bayan.Amanda`). `Sukhan` provides Urdu voices (e.g., `Telnyx.Sukhan.urdu-professor`); `voice_speed` is not supported. - **Minimax:** Use `Minimax..` (e.g., `Minimax.speech-02-hd.Wise_Woman`). Supported models: `speech-02-turbo`, `speech-02-hd`, `speech-2.6-turbo`, `speech-2.8-turbo`. Use `voice_settings` to configure speed, volume, pitch, and language_boost. - **Resemble:** Use `Resemble.Turbo.` (e.g., `Resemble.Turbo.my_voice`). Only `Turbo` model is supported. Use `voice_settings` to configure precision, sample_rate, and format. - **Inworld:** Use `Inworld..` (e.g., `Inworld.Mini.Loretta`, `Inworld.Max.Oliver`, `Inworld.TTS2.Loretta`). Supported models: `Mini`, `Max`, `TTS2`. Use `voice_settings` to configure `delivery_mode` (`STABLE`, `BALANCED`, `CREATIVE`), supported by `TTS2` only. - **Fish Audio:** Use `FishAudio..` (e.g., `FishAudio.s2.1-pro.`). Supported models: `s2.1-pro`, `s2-pro`, `s1`. `VoiceId` is a Fish Voice-Library reference ID. - **Soniox:** Use `Soniox..` (e.g., `Soniox.tts-rt-v2.Emma`). Supported model: `tts-rt-v2`. Browse the catalog via the [Voices API](https://developers.telnyx.com/api-reference/text-to-speech-commands/list-available-voices). Every voice speaks all supported languages; set `language` to the two-letter ISO 639-1 code of the text, for example `it`. SSML is not supported. Use `voice_settings` to configure `speed` (0.7 to 1.3) and `reduce_silence`. - **xAI:** Use `xAI.` (e.g., `xAI.eve`). Available voices: `eve`, `ara`, `rex`, `sal`, `leo`. - **Humain:** Use `Humain.` (e.g., `Humain.sara-ar`). Available voices: `sara-en`, `abdulaziz-en`, `sara-ar`, `abdulaziz-ar`, `nourah-ar`, `abdullah-ar`. Native Arabic (Saudi dialect) and English voices only — no `ModelId` segment.  For service_level basic, you may define the gender of the speaker (male or female).}\n@optional {invalid_payload: str # The text or SSML to be converted into speech when digits don't match the `valid_digits` parameter or the number of digits is not between `min` and `max`. There is a 3,000 character limit., payload_type: str(text/ssml)=text # The type of the provided payload. The payload can either be plain text, or Speech Synthesis Markup Language (SSML)., service_level: str(basic/premium)=premium # This parameter impacts speech quality, language options and payload types. When using `basic`, only the `en-US` language and payload type `text` are allowed., voice_settings: any # The settings associated with the voice selected, language: str(arb/cmn-CN/cy-GB/da-DK/de-DE/en-AU/en-GB/en-GB-WLS/en-IN/en-US/es-ES/es-MX/es-US/fr-CA/fr-FR/hi-IN/is-IS/it-IT/ja-JP/ko-KR/nb-NO/nl-NL/pl-PL/pt-BR/pt-PT/ro-RO/ru-RU/sv-SE/tr-TR) # The language you want spoken. This parameter is ignored when a `Polly.*` voice is specified., minimum_digits: int(int32)=1 # The minimum number of digits to fetch. This parameter has a minimum value of 1., maximum_digits: int(int32)=128 # The maximum number of digits to fetch. This parameter has a maximum value of 128., maximum_tries: int(int32)=3 # The maximum number of times that a file should be played back if there is no input from the user on the call., timeout_millis: int(int32)=60000 # The number of milliseconds to wait for a DTMF response after speak ends before a replaying the sound file., terminating_digit: str=# # The digit used to terminate input if fewer than `maximum_digits` digits have been gathered. Set to an empty string to disable the terminating digit entirely, so that a digit such as `#` can be collected as input per `valid_digits`., valid_digits: str=0123456789#* # A list of all digits accepted as valid., inter_digit_timeout_millis: int(int32)=5000 # The number of milliseconds to wait for input between digits., client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/hangup\n@desc Hangup call\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`., custom_headers: [map{name!: str, value!: str}] # Custom headers to be added to the SIP BYE message.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/leave_queue\n@desc Remove call from a queue\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/pay\n@desc Process a payment\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {connector_name: str=Default # Name of the Pay connector used to process the transaction., amount: num # Amount to charge. Required when `transaction_type` is `charge`., currency: str(USD/usd)=USD # Currency used for the transaction. Pay currently supports USD only., payment_token: str # Existing payment token. When supplied, payment-detail collection is skipped., payment_method: str(credit-card/ach-debit)=credit-card # Payment method to collect., valid_card_types: [str] # Restricts accepted card numbers to the listed card types. When the caller enters a card number that does not match one of the listed types, Pay treats the input as invalid and re-prompts for the card number. Cannot be used together with `payment_token`., transaction_type: str(charge/tokenize) # Transaction to perform. If omitted, Pay infers `tokenize` when `amount` is absent or zero and `charge` when `amount` is positive., description: str # Optional description forwarded with the payment transaction., client_state: str # Base64-encoded state included in subsequent webhooks., metadata: map # Metadata forwarded to the Pay connector., parameters: map # Additional parameters forwarded to the Pay connector., prompts: map{payment-card-number: any, expiration-date: any, postal-code: any, security-code: any, bank-routing-number: any, bank-account-number: any} # Custom text-to-speech prompts keyed by payment collection step., max_attempts: int(int32)=3 # Maximum number of attempts for each payment collection step., timeout_millis: int(int32)=5000 # Time in milliseconds to wait for DTMF input for each collection step., inter_digit_timeout_millis: int(int32)=5000 # Time in milliseconds to wait between consecutive DTMF digits., voice: str=female # Voice used for payment prompts. Accepts `male`, `female`, or a provider voice in `..` format, for example `AWS.Polly.Joanna` or `Telnyx.KokoroTTS.af`., language: str=en-US # Language used for payment prompts., service_level: str=premium # Speech synthesis service level used for payment prompts. Pay defaults to `premium`., command_id: str # Idempotency key for the command. Telnyx ignores a duplicate command with the same `command_id` for the same `call_control_id`.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/playback_start\n@desc Play audio URL\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {audio_url: str # The URL of a file to be played back on the call. The URL can point to either a WAV or MP3 file. media_name and audio_url cannot be used together in one request., media_name: str # The media_name of a file to be played back on the call. The media_name must point to a file previously uploaded to api.telnyx.com/v2/media by the same user/organization. The file must either be a WAV or MP3 file., loop: any, overlay: bool=false # When enabled, audio will be mixed on top of any other audio that is actively being played back. Note that `overlay: true` will only work if there is another audio file already being played on the call., stop: str # When specified, it stops the current audio being played. Specify `current` to stop the current audio being played, and to play the next file in the queue. Specify `all` to stop the current audio file being played and to also clear all audio files from the queue., target_legs: str=self # Specifies the leg or legs on which audio will be played. If supplied, the value must be either `self`, `opposite` or `both`., cache_audio: bool=true # Caches the audio file. Useful when playing the same audio file multiple times during the call., audio_type: str(mp3/wav)=mp3 # Specifies the type of audio provided in `audio_url` or `playback_content`., playback_content: str # Allows a user to provide base64 encoded mp3 or wav. Note: when using this parameter, `media_url` and `media_name` in the `playback_started` and `playback_ended` webhooks will be empty, client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/playback_stop\n@desc Stop audio playback\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {overlay: bool=false # When enabled, it stops the audio being played in the overlay queue., stop: str=all # Use `current` to stop the current audio being played. Use `all` to stop the current audio file being played and clear all audio files from the queue., client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/record_pause\n@desc Record pause\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`., recording_id: str(uuid) # Uniquely identifies the resource.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/record_resume\n@desc Record resume\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`., recording_id: str(uuid) # Uniquely identifies the resource.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/record_start\n@desc Recording start\n@required {call_control_id: str # Unique identifier and token for controlling the call, format: str(wav/mp3) # The audio file format used when storing the call recording. Can be either `mp3` or `wav`., channels: str(single/dual) # When `dual`, final audio file will be stereo recorded with the first leg on channel A, and the rest on channel B.}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`., play_beep: bool # If enabled, a beep sound will be played at the start of a recording., max_length: int(int32)=0 # Defines the maximum length for the recording in seconds. The minimum value is 0. The maximum value is 14400. The default value is 0 (infinite), timeout_secs: int(int32)=0 # The number of seconds that Telnyx will wait for the recording to be stopped if silence is detected. The timer only starts when the speech is detected. Please note that call transcription is used to detect silence and the related charge will be applied. The minimum value is 0. The default value is 0 (infinite), recording_track: str(both/inbound/outbound)=both # The audio track to be recorded. Can be either `both`, `inbound` or `outbound`. If only single track is specified (`inbound`, `outbound`), `channels` configuration is ignored and it will be recorded as mono (single channel)., trim: str # When set to `trim-silence`, silence will be removed from the beginning and end of the recording., custom_file_name: str # The custom recording file name to be used instead of the default `call_leg_id`. Telnyx will still add a Unix timestamp suffix., transcription: bool=false # Enable post recording transcription. The default value is false., transcription_engine: str(A/B/deepgram/nova-3)=A # Engine to use for speech recognition. `A` - `Google`, `B` - `Telnyx`, `deepgram/nova-3` - `Deepgram Nova-3`. Note: `deepgram/nova-3` supports only `en` and `en-{Region}` languages., transcription_language: str(af/af-ZA/am/am-ET/ar/ar-AE/ar-BH/ar-DZ/ar-EG/ar-IL/ar-IQ/ar-JO/ar-KW/ar-LB/ar-MA/ar-MR/ar-OM/ar-PS/ar-QA/ar-SA/ar-TN/ar-YE/as/auto_detect/az/az-AZ/ba/be/bg/bg-BG/bn/bn-BD/bn-IN/bo/br/bs/bs-BA/ca/ca-ES/cs/cs-CZ/cy/da/da-DK/de/de-AT/de-CH/de-DE/el/el-GR/en/en-AU/en-CA/en-GB/en-GH/en-HK/en-IE/en-IN/en-KE/en-NG/en-NZ/en-PH/en-PK/en-SG/en-TZ/en-US/en-ZA/es/es-419/es-AR/es-BO/es-CL/es-CO/es-CR/es-DO/es-EC/es-ES/es-GT/es-HN/es-MX/es-NI/es-PA/es-PE/es-PR/es-PY/es-SV/es-US/es-UY/es-VE/et/et-EE/eu/eu-ES/fa/fa-IR/fi/fi-FI/fil-PH/fo/fr/fr-BE/fr-CA/fr-CH/fr-FR/gl/gl-ES/gu/gu-IN/ha/haw/he/hi/hi-IN/hr/hr-HR/ht/hu/hu-HU/hy/hy-AM/id/id-ID/is/is-IS/it/it-CH/it-IT/iw-IL/ja/ja-JP/jv-ID/jw/ka/ka-GE/kk/kk-KZ/km/km-KH/kn/kn-IN/ko/ko-KR/la/lb/ln/lo/lo-LA/lt/lt-LT/lv/lv-LV/mg/mi/mk/mk-MK/ml/ml-IN/mn/mn-MN/mr/mr-IN/ms/ms-MY/mt/my/my-MM/ne/ne-NP/nl/nl-BE/nl-NL/nn/no/no-NO/oc/pa/pa-Guru-IN/pl/pl-PL/ps/pt/pt-BR/pt-PT/ro/ro-RO/ru/ru-RU/rw-RW/sa/sd/si/si-LK/sk/sk-SK/sl/sl-SI/sn/so/sq/sq-AL/sr/sr-RS/ss-latn-za/st-ZA/su/su-ID/sv/sv-SE/sw/sw-KE/sw-TZ/ta/ta-IN/ta-LK/ta-MY/ta-SG/te/te-IN/tg/th/th-TH/tk/tl/tn-latn-za/tr/tr-TR/ts-ZA/tt/uk/uk-UA/ur/ur-IN/ur-PK/uz/uz-UZ/ve-ZA/vi/vi-VN/xh-ZA/yi/yo/yue-Hant-HK/zh/zh-TW/zu-ZA)=en-US # Language code for transcription. Note: Not all languages are supported by all transcription engines (google, telnyx, deepgram). See engine-specific documentation for supported values., transcription_profanity_filter: bool=false # Enables profanity_filter. Applies to `google` engine only., transcription_speaker_diarization: bool=false # Enables speaker diarization. Applies to `google` engine only., transcription_min_speaker_count: int(int32)=2 # Defines minimum number of speakers in the conversation. Applies to `google` engine only., transcription_max_speaker_count: int(int32)=6 # Defines maximum number of speakers in the conversation. Applies to `google` engine only.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations., 503: Service unavailable. The recording could not be started because the recording service is temporarily unavailable. The recording was not started; retry the request.}\n\n@endpoint POST /calls/{call_control_id}/actions/record_stop\n@desc Recording stop\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`., recording_id: str(uuid) # Uniquely identifies the resource.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/refer\n@desc SIP Refer a call\n@required {call_control_id: str # Unique identifier and token for controlling the call, sip_address: str # The SIP URI to which the call will be referred to.}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid execution of duplicate commands. Telnyx will ignore subsequent commands with the same `command_id` as one that has already been executed., custom_headers: [map{name!: str, value!: str}] # Custom headers to be added to the SIP INVITE., sip_auth_username: str # SIP Authentication username used for SIP challenges., sip_auth_password: str # SIP Authentication password used for SIP challenges., sip_headers: [map{name!: str, value!: str}] # SIP headers to be added to the request. Currently only User-to-User header is supported.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/reject\n@desc Reject a call\n@required {call_control_id: str # Unique identifier and token for controlling the call, cause: str(CALL_REJECTED/NOT_FOUND/TEMPORARILY_UNAVAILABLE/USER_BUSY) # Cause for call rejection. The cause sets the SIP response the caller receives: `USER_BUSY` sends 486 User Busy, `CALL_REJECTED` sends 603 Decline, `NOT_FOUND` sends 404 Not Found, and `TEMPORARILY_UNAVAILABLE` sends 480 Temporarily Unavailable.}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/send_dtmf\n@desc Send DTMF\n@required {call_control_id: str # Unique identifier and token for controlling the call, digits: str # DTMF digits to send. Valid digits are 0-9, A-D, *, and #. Pauses can be added using w (0.5s) and W (1s).}\n@optional {duration_millis: int(int32)=250 # Specifies for how many milliseconds each digit will be played in the audio stream. Ranges from 100 to 500ms, client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/send_sip_info\n@desc Send SIP info\n@required {call_control_id: str # Unique identifier and token for controlling the call, content_type: str # Content type of the INFO body. Must be MIME type compliant. There is a 1,400 bytes limit, body: str # Content of the SIP INFO}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/siprec_start\n@desc SIPREC start\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {connector_name: str # Name of configured SIPREC connector to be used., sip_transport: str(udp/tcp/tls)=udp # Specifies SIP transport protocol., siprec_track: str(inbound_track/outbound_track/both_tracks)=both_tracks # Specifies which track should be sent on siprec session., include_metadata_custom_headers: bool(true/false) # When set, custom parameters will be added as metadata (recording.session.ExtensionParameters). Otherwise, they’ll be added to sip headers., secure: bool(true/false) # Controls whether to encrypt media sent to your SRS using SRTP and TLS. When set you need to configure SRS port in your connector to 5061., session_timeout_secs: int=1800 # Sets `Session-Expires` header to the INVITE. A reinvite is sent every half the value set. Usefull for session keep alive. Minimum value is 90, set to 0 to disable., client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/siprec_stop\n@desc SIPREC stop\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/speak\n@desc Speak text\n@required {call_control_id: str # Unique identifier and token for controlling the call, payload: str # The text or SSML to be converted into speech. There is a 3,000 character limit., voice: str # Specifies the voice used in speech synthesis.  - Define voices using the format `..`. Specifying only the provider will give default values for voice_id and model_id.   **Supported Providers:** - **AWS:** Use `AWS.Polly.` (e.g., `AWS.Polly.Joanna`). For neural voices, which provide more realistic, human-like speech, append `-Neural` to the `VoiceId` (e.g., `AWS.Polly.Joanna-Neural`). Check the [available voices](https://docs.aws.amazon.com/polly/latest/dg/available-voices.html) for compatibility. - **Azure:** Use `Azure.` (e.g., `Azure.en-CA-ClaraNeural`, `Azure.en-US-BrianMultilingualNeural`, `Azure.en-US-Ava:DragonHDLatestNeural`). For a complete list of voices, go to [Azure Voice Gallery](https://speech.microsoft.com/portal/voicegallery). Use `voice_settings` to configure custom deployments, regions, or API keys. - **ElevenLabs:** Use `ElevenLabs..` (e.g., `ElevenLabs.eleven_multilingual_v2.21m00Tcm4TlvDq8ikWAM`). The `ModelId` part is optional. To use ElevenLabs, you must provide your ElevenLabs API key as an integration identifier secret in `\"voice_settings\": {\"api_key_ref\": \"\"}`. See [integration secrets documentation](https://developers.telnyx.com/api/secrets-manager/integration-secrets/create-integration-secret) for details. Check [available voices](https://elevenlabs.io/docs/api-reference/get-voices). - **Telnyx:** Use `Telnyx..` (e.g., `Telnyx.KokoroTTS.af`). Use `voice_settings` to configure voice_speed and other synthesis parameters. `Bayan` provides Arabic (multiple dialects) and English voices (e.g., `Telnyx.Bayan.Ahmed`, `Telnyx.Bayan.Amanda`). `Sukhan` provides Urdu voices (e.g., `Telnyx.Sukhan.urdu-professor`); `voice_speed` is not supported. - **Minimax:** Use `Minimax..` (e.g., `Minimax.speech-02-hd.Wise_Woman`). Supported models: `speech-02-turbo`, `speech-02-hd`, `speech-2.6-turbo`, `speech-2.8-turbo`. Use `voice_settings` to configure speed, volume, pitch, and language_boost. - **Resemble:** Use `Resemble.Turbo.` (e.g., `Resemble.Turbo.my_voice`). Only `Turbo` model is supported. Use `voice_settings` to configure precision, sample_rate, and format. - **Inworld:** Use `Inworld..` (e.g., `Inworld.Mini.Loretta`, `Inworld.Max.Oliver`, `Inworld.TTS2.Loretta`). Supported models: `Mini`, `Max`, `TTS2`. Use `voice_settings` to configure `delivery_mode` (`STABLE`, `BALANCED`, `CREATIVE`), supported by `TTS2` only. - **Fish Audio:** Use `FishAudio..` (e.g., `FishAudio.s2.1-pro.`). Supported models: `s2.1-pro`, `s2-pro`, `s1`. `VoiceId` is a Fish Voice-Library reference ID. - **Soniox:** Use `Soniox..` (e.g., `Soniox.tts-rt-v2.Emma`). Supported model: `tts-rt-v2`. Browse the catalog via the [Voices API](https://developers.telnyx.com/api-reference/text-to-speech-commands/list-available-voices). Every voice speaks all supported languages; set `language` to the two-letter ISO 639-1 code of the text, for example `it`. SSML is not supported. Use `voice_settings` to configure `speed` (0.7 to 1.3) and `reduce_silence`. - **xAI:** Use `xAI.` (e.g., `xAI.eve`). Available voices: `eve`, `ara`, `rex`, `sal`, `leo`. - **Humain:** Use `Humain.` (e.g., `Humain.sara-ar`). Available voices: `sara-en`, `abdulaziz-en`, `sara-ar`, `abdulaziz-ar`, `nourah-ar`, `abdullah-ar`. Native Arabic (Saudi dialect) and English voices only — no `ModelId` segment.  For service_level basic, you may define the gender of the speaker (male or female).}\n@optional {payload_type: str(text/ssml)=text # The type of the provided payload. The payload can either be plain text, or Speech Synthesis Markup Language (SSML)., service_level: str(basic/premium)=premium # This parameter impacts speech quality, language options and payload types. When using `basic`, only the `en-US` language and payload type `text` are allowed., stop: str # When specified, it stops the current audio being played. Specify `current` to stop the current audio being played, and to play the next file in the queue. Specify `all` to stop the current audio file being played and to also clear all audio files from the queue., voice_settings: any # The settings associated with the voice selected, language: str(arb/cmn-CN/cy-GB/da-DK/de-DE/en-AU/en-GB/en-GB-WLS/en-IN/en-US/es-ES/es-MX/es-US/fr-CA/fr-FR/hi-IN/is-IS/it-IT/ja-JP/ko-KR/nb-NO/nl-NL/pl-PL/pt-BR/pt-PT/ro-RO/ru-RU/sv-SE/tr-TR) # The language you want spoken. This parameter is ignored when a `Polly.*` voice is specified., client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`., loop: any, target_legs: str(self/opposite/both)=self # Specifies which legs of the call should receive the spoken audio.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/streaming_start\n@desc Streaming start\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {stream_url: str # The destination WebSocket address where the stream is going to be delivered., stream_track: str(inbound_track/outbound_track/both_tracks)=inbound_track # Specifies which track should be streamed., stream_codec: str(PCMU/PCMA/G722/OPUS/AMR-WB/L16/default)=default # Specifies the codec to be used for the streamed audio. When set to 'default' or when transcoding is not possible, the codec from the call will be used., stream_bidirectional_mode: str(mp3/rtp)=mp3 # Configures method of bidirectional streaming (mp3, rtp)., stream_bidirectional_codec: str(PCMU/PCMA/G722/OPUS/AMR-WB/L16)=PCMU # Indicates codec for bidirectional streaming RTP payloads. Used only with stream_bidirectional_mode=rtp. Case sensitive., stream_bidirectional_target_legs: str(both/self/opposite)=opposite # Specifies which call legs should receive the bidirectional stream audio., stream_bidirectional_sampling_rate: int(8000/16000/22050/24000/48000)=8000 # Audio sampling rate., enable_dialogflow: bool=false # Enables Dialogflow for the current call. The default value is false., dialogflow_config: map{analyze_sentiment: bool, partial_automated_agent_reply: bool}, client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`., custom_parameters: [map{name: str, value: str}] # Custom parameters to be sent as part of the WebSocket connection., stream_auth_token: str # An authentication token to be sent as part of the WebSocket connection. Maximum length is 4000 characters.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/streaming_stop\n@desc Streaming stop\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`., stream_id: str(uuid) # Identifies the stream. If the `stream_id` is not provided the command stops all streams associated with a given `call_control_id`.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/suppression_start\n@desc Noise Suppression Start (BETA)\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`., direction: str(inbound/outbound/both)=inbound # The direction of the audio stream to be noise suppressed., noise_suppression_engine: str(Denoiser/DeepFilterNet/Krisp/AiCoustics/aic_l_quail/aic_l_rook/aic_s_quail/aic_s_rook/quail_voice_focus_s/quail_voice_focus_xs)=Denoiser # The engine to use for noise suppression. For backward compatibility, engines A, B, C, and D are also supported, but are deprecated:  A - Denoiser  B - DeepFilterNet  C - Krisp  D - AiCoustics, noise_suppression_engine_config: map{attenuation_limit: int, mode: str, model: str, suppression_level: num, family: str, size: str, enhancement_level: num, voice_gain: num} # Configuration parameters for noise suppression engines. Different engines support different parameters.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/suppression_stop\n@desc Noise Suppression Stop (BETA)\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/switch_supervisor_role\n@desc Switch supervisor role\n@required {call_control_id: str # Unique identifier and token for controlling the call, role: str(barge/whisper/monitor) # The supervisor role to switch to. 'barge' allows speaking to both parties, 'whisper' allows speaking to caller only, 'monitor' allows listening only.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/transcription_start\n@desc Transcription start\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {transcription_engine: str(Google/Telnyx/Deepgram/Azure/xAI/AssemblyAI/Speechmatics/Soniox/Parakeet/Humain/Reson8/Cohere/A/B)=Google # Engine to use for speech recognition. Legacy values `A` - `Google`, `B` - `Telnyx` are supported for backward compatibility., transcription_engine_config: any, client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., transcription_tracks: str=inbound # Indicates which leg of the call will be transcribed. Use `inbound` for the leg that requested the transcription, `outbound` for the other leg, and `both` for both legs of the call. Will default to `inbound`., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/transcription_stop\n@desc Transcription stop\n@required {call_control_id: str # Unique identifier and token for controlling the call}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /calls/{call_control_id}/actions/transfer\n@desc Transfer call\n@required {call_control_id: str # Unique identifier and token for controlling the call, to: str # The DID or SIP URI to dial out to. For SIP URI destinations, append `;secure=true` or `;secure=srtp` to enable SRTP media encryption for that endpoint, or `;secure=dtls` to enable DTLS media encryption for that endpoint. If `media_encryption` is set to `SRTP` or `DTLS`, it takes precedence over any per-endpoint `secure` URI parameter. You may also append a comma followed by DTMF digits (e.g. `+18004247767,200`) to play those digits as DTMF once the transfer destination answers — equivalent to setting `send_digits_on_answer` separately. If both are present, the explicit `send_digits_on_answer` parameter takes precedence.}\n@optional {from: str # The `from` number to be used as the caller id presented to the destination (`to` number). The number should be in +E164 format. This attribute will default to the `to` number of the original call if omitted., diversion: str # The `to` number of an active inbound call, in +E164 format. Telnyx checks whether there is currently an active inbound call where `to` matches this `diversion` value and `from` matches the `from` number supplied for this request. If such a call exists, the `from` number is treated as verified (since it is already on an active inbound call to you) and can be used as the caller id for this outbound call., from_display_name: str # The `from_display_name` string to be used as the caller id name (SIP From Display Name) presented to the destination (`to` number). The string should have a maximum of 128 characters, containing only letters, numbers, spaces, and -_~!.+ special characters. If ommited, the display name will be the same as the number in the `from` field., privacy: str(id/none) # Indicates the privacy level to be used for the call. When set to `id`, caller ID information (name and number) will be hidden from the called party. When set to `none` or omitted, caller ID will be shown normally., audio_url: str # The URL of a file to be played back when the transfer destination answers before bridging the call. The URL can point to either a WAV or MP3 file. media_name and audio_url cannot be used together in one request., send_digits_on_answer: str # DTMF digits to send automatically after the transfer destination answers. Useful for reaching an extension behind an IVR (e.g. `\"200\"` to dial extension 200 once the called party picks up). Allowed characters: `0-9`, `A-D`, `w` (0.5s pause), `W` (1s pause), `*`, `#`. Maximum 64 characters. When omitted, no automatic DTMF is sent. May also be supplied inline by appending `,` to `to` (e.g. `to=+18004247767,200`); if both forms are present, this explicit field takes precedence., early_media: bool=true # If set to false, early media will not be passed to the originating leg., media_name: str # The media_name of a file to be played back when the transfer destination answers before bridging the call. The media_name must point to a file previously uploaded to api.telnyx.com/v2/media by the same user/organization. The file must either be a WAV or MP3 file., timeout_secs: int(int32)=30 # The number of seconds that Telnyx will wait for the call to be answered by the destination to which it is being transferred. If the timeout is reached before an answer is received, the call will hangup and a `call.hangup` webhook with a `hangup_cause` of `timeout` will be sent. Minimum value is 5 seconds. Maximum value is 600 seconds., time_limit_secs: int(int32)=14400 # Sets the maximum duration of a Call Control Leg in seconds. If the time limit is reached, the call will hangup and a `call.hangup` webhook with a `hangup_cause` of `time_limit` will be sent. For example, by setting a time limit of 120 seconds, a Call Leg will be automatically terminated two minutes after being answered. The default time limit is 14400 seconds or 4 hours and this is also the maximum allowed call length., park_after_unbridge: str # Specifies behavior after the bridge ends (i.e. the opposite leg either hangs up or is transferred). If supplied with the value `self`, the current leg will be parked after unbridge. If not set, the default behavior is to hang up the leg., answering_machine_detection: str(premium/detect/detect_beep/detect_words/greeting_end/disabled)=disabled # Enables Answering Machine Detection. When a call is answered, Telnyx runs real-time detection to determine if it was picked up by a human or a machine and sends an `call.machine.detection.ended` webhook with the analysis result. If 'greeting_end' or 'detect_words' is used and a 'machine' is detected, you will receive another 'call.machine.greeting.ended' webhook when the answering machine greeting ends with a beep or silence. If `detect_beep` is used, you will only receive 'call.machine.greeting.ended' if a beep is detected., answering_machine_detection_config: map{total_analysis_time_millis: int(int32), beep_detection_profile: str, beep_min_frequency_hz: int(int32), beep_max_frequency_hz: int(int32), beep_min_tone_duration_millis: int(int32), beep_spectral_confirmation: bool, beep_spectral_window_millis: int(int32), beep_spectral_min_purity: num, beep_spectral_reject_fax_cng: bool, after_greeting_silence_millis: int(int32), between_words_silence_millis: int(int32), greeting_duration_millis: int(int32), initial_silence_millis: int(int32), maximum_number_of_words: int(int32), maximum_word_length_millis: int(int32), silence_threshold: int(int32), greeting_total_analysis_time_millis: int(int32), greeting_silence_duration_millis: int(int32)} # Optional configuration parameters to modify 'answering_machine_detection' performance. Only `total_analysis_time_millis` and `greeting_duration_millis` parameters are applicable when `premium` is selected as answering_machine_detection., custom_headers: [map{name!: str, value!: str}] # Custom headers to be added to the SIP INVITE., client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., target_leg_client_state: str # Use this field to add state to every subsequent webhook for the new leg. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`., media_encryption: str(disabled/SRTP/DTLS)=disabled # Defines whether media should be encrypted on the new call leg. For SIP URI destinations, media encryption can also be requested per endpoint with the `secure` URI parameter: `;secure=true` or `;secure=srtp` enables SRTP, and `;secure=dtls` enables DTLS. This parameter, when set to `SRTP` or `DTLS`, takes precedence over the per-endpoint `secure` value., sip_auth_username: str # SIP Authentication username used for SIP challenges., sip_auth_password: str # SIP Authentication password used for SIP challenges., sip_headers: [map{name!: str, value!: str}] # SIP headers to be added to the SIP INVITE. Currently only User-to-User header is supported., sip_transport_protocol: str(UDP/TCP/TLS)=UDP # Defines SIP transport protocol to be used on the call., sound_modifications: map{pitch: num(float), semitone: num(float), octaves: num(float), track: str} # Use this field to modify sound effects, for example adjust the pitch., webhook_url: str # Use this field to override the URL for which Telnyx will send subsequent webhooks to for this call., webhook_url_method: str(POST/GET)=POST # HTTP request type used for `webhook_url`., mute_dtmf: str(none/both/self/opposite)=none # When enabled, DTMF tones are not passed to the call participant. The webhooks containing the DTMF information will be sent., record: str # Start recording automatically after an event. Disabled by default., record_channels: str(single/dual)=dual # Defines which channel should be recorded ('single' or 'dual') when `record` is specified., record_format: str(wav/mp3)=mp3 # Defines the format of the recording ('wav' or 'mp3') when `record` is specified., record_max_length: int(int32)=0 # Defines the maximum length for the recording in seconds when `record` is specified. The minimum value is 0. The maximum value is 43200. The default value is 0 (infinite)., record_timeout_secs: int(int32)=0 # The number of seconds that Telnyx will wait for the recording to be stopped if silence is detected when `record` is specified. The timer only starts when the speech is detected. Please note that call transcription is used to detect silence and the related charge will be applied. The minimum value is 0. The default value is 0 (infinite)., record_track: str(both/inbound/outbound)=both # The audio track to be recorded. Can be either `both`, `inbound` or `outbound`. If only single track is specified (`inbound`, `outbound`), `channels` configuration is ignored and it will be recorded as mono (single channel)., record_trim: str # When set to `trim-silence`, silence will be removed from the beginning and end of the recording., record_custom_file_name: str # The custom recording file name to be used instead of the default `call_leg_id`. Telnyx will still add a Unix timestamp suffix., sip_region: str(US/Europe/Canada/Australia/Middle East)=US # Defines the SIP region to be used for the call., preferred_codecs: str # The list of comma-separated codecs in order of preference to be used during the call. The codecs supported are `G722`, `PCMU`, `PCMA`, `G729`, `OPUS`, `VP8`, `H264`, `AMR-WB`., webhook_urls: map # A map of event types to arrays of webhook URLs. When an event of the specified type occurs, the webhook URLs associated with that event type will be called instead of `webhook_url`. Events not mapped here will use the default `webhook_url`., webhook_urls_method: str(POST/GET)=POST # HTTP request method to invoke `webhook_urls`., webhook_retries_policies: map # A map of event types to retry policies. Each retry policy contains an array of `retries_ms` specifying the delays between retry attempts in milliseconds. Maximum 5 retries, total delay cannot exceed 60 seconds., route_to_mobile: bool=false # When set to true, routes the call directly to the mobile device associated with the destination Telnyx Mobile number, bypassing Inbound Calls Interception configured in the Telnyx Portal under Mobile Numbers → select the number → Voice → Call Interception. Use this when transferring an intercepted call to the mobile device to prevent the call from being intercepted again. Defaults to false.}\n@returns(200) {data: map{result: str}} # Successful response upon making a call control command.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endgroup\n\n@group channel_zones\n@endpoint GET /channel_zones\n@desc List your voice channels for non-US zones\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # A list of channel zones\n@errors {400: Bad request, 401: Unauthorized, 404: Resource not found}\n\n@endpoint PUT /channel_zones/{channel_zone_id}\n@desc Update voice channels for non-US Zones\n@required {channels: int(int64) # The number of reserved channels}\n@returns(200) {record_type: str, countries: [str], id: str, name: str, channels: int(int64), created_at: str, updated_at: str} # Successfuly patched channel zone\n@errors {400: Bad request, 401: Unauthorized, 404: Resource not found}\n@example_request {\"channels\":0}\n\n@endgroup\n\n@group charges_breakdown\n@endpoint GET /charges_breakdown\n@desc Get monthly charges breakdown\n@required {start_date: str(date) # Start date for the charges breakdown in ISO date format (YYYY-MM-DD)}\n@optional {end_date: str(date) # End date for the charges breakdown in ISO date format (YYYY-MM-DD). If not provided, defaults to start_date + 1 month. The date is exclusive, data for the end_date itself is not included in the report. The interval between start_date and end_date cannot exceed 31 days., format: str(json/csv)=json # Response format}\n@returns(200) {data: map{user_id: str, start_date: str(date), end_date: str(date), user_email: str(email), currency: str, results: [map]}} # Monthly charges breakdown\n@errors {400: Invalid request parameters or date range, 422: User account not found}\n\n@endgroup\n\n@group charges_summary\n@endpoint GET /charges_summary\n@desc Get monthly charges summary\n@required {start_date: str(date) # Start date for the charges summary in ISO date format (YYYY-MM-DD), end_date: str(date) # End date for the charges summary in ISO date format (YYYY-MM-DD). The date is exclusive, data for the end_date itself is not included in the report. The interval between start_date and end_date cannot exceed 31 days.}\n@returns(200) {data: map{user_id: str, start_date: str(date), end_date: str(date), user_email: str(email), currency: str, summary: map{lines: [any], adjustments: [map]}, total: map{new_mrc: str, new_otc: str, existing_mrc: str, other: str, credits: str, ledger_adjustments: str, grand_total: str}}} # Monthly charges summary\n@errors {400: Invalid request parameters or date range, 422: User account not found}\n\n@endgroup\n\n@group comments\n@endpoint GET /comments\n@desc Retrieve all comments\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[comment_record_type], filter[comment_record_id]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # An array of Comment Responses\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint POST /comments\n@desc Create a comment\n@optional {id: str(uuid), body: str, commenter: str, commenter_type: str(admin/user), comment_record_type: str(sub_number_order/requirement_group), comment_record_id: str(uuid), read_at: str(date-time) # An ISO 8901 datetime string for when the comment was read., created_at: str(date-time) # An ISO 8901 datetime string denoting when the comment was created., updated_at: str(date-time) # An ISO 8901 datetime string for when the comment was updated.}\n@returns(200) {data: any} # A Comment Response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /comments/{id}\n@desc Retrieve a comment\n@required {id: str # The comment ID.}\n@returns(200) {data: any} # A Comment Response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint PATCH /comments/{id}/read\n@desc Mark a comment as read\n@required {id: str # The comment ID.}\n@returns(200) {data: any} # A Comment Response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group compute\n@endpoint GET /compute/funcs/{id}/logs\n@desc Get function logs\n@required {id: str # Function ID}\n@optional {type: str(runtime/invocations)=runtime # Log stream to return., start_time: str(date-time) # Return records at or after this RFC 3339 timestamp., end_time: str(date-time) # Return records at or before this RFC 3339 timestamp., limit: int # Maximum records to return.}\n@returns(200) Logs retrieved successfully\n@errors {400: Invalid query parameter, 404: Function not found, 422: Invalid function ID, 500: Internal server error}\n\n@endpoint DELETE /compute/funcs/{id}/logs/export\n@desc Delete log export configuration\n@required {id: str # Function ID}\n@returns(204) Log export configuration deleted, or none was configured (idempotent). No content is returned.\n@errors {400: Invalid request, 401: Unauthorized, 404: Function not found, 422: Invalid function ID, 500: Internal server error}\n\n@endpoint GET /compute/funcs/{id}/logs/export\n@desc Get log export configuration\n@required {id: str # Function ID}\n@returns(200) {data: map{record_type: str, id: str, func_id: str, endpoint: str(uri), enabled: bool, runtime_export_enabled: bool, invocation_export_enabled: bool, created_at: str(date-time), updated_at: str(date-time)}} # Log export configuration retrieved successfully\n@errors {400: Invalid query parameter, 401: Unauthorized, 404: Function not found, or no log export destination configured for this function (both return error code 10005), 422: Invalid function ID, 500: Internal server error}\n\n@endpoint PUT /compute/funcs/{id}/logs/export\n@desc Configure log export destination\n@required {id: str # Function ID, endpoint: str(uri) # HTTPS URL to push logs to, headers: map # Headers attached to every export push, as key-value pairs (e.g. an auth token the collector expects). Required even when empty — {} means \"no headers\". Encrypted at rest; never returned., runtime_export_enabled: bool # Export runtime logs (function stdout/stderr) to this destination, invocation_export_enabled: bool # Export invocation records (one per HTTP request) to this destination}\n@returns(200) {data: map{record_type: str, id: str, func_id: str, endpoint: str(uri), enabled: bool, runtime_export_enabled: bool, invocation_export_enabled: bool, created_at: str(date-time), updated_at: str(date-time)}} # Log export configuration replaced successfully\n@returns(201) {data: map{record_type: str, id: str, func_id: str, endpoint: str(uri), enabled: bool, runtime_export_enabled: bool, invocation_export_enabled: bool, created_at: str(date-time), updated_at: str(date-time)}} # Log export configuration created\n@errors {400: Invalid request body, 401: Unauthorized, 404: Function not found, 422: Invalid function ID, or a required request field was omitted (full replace — no partial updates), 500: Internal server error}\n@example_request {\"endpoint\":\"https://api.honeycomb.io/v1/logs\",\"headers\":{\"x-honeycomb-team\":\"abc123\"},\"runtime_export_enabled\":true,\"invocation_export_enabled\":true}\n\n@endpoint GET /compute/funcs/{id}/metric_aggregates\n@desc Get function metric aggregates\n@required {id: str # Function ID, start_time: str(date-time) # Inclusive window start, UTC ISO 8601 with milliseconds, end_time: str(date-time) # Exclusive window end, UTC ISO 8601 with milliseconds}\n@optional {filter[edge_site]: str: any # Edge site filter, filter[namespace]: str # Kubernetes namespace filter, page[number]: int=1, page[size]: int=20}\n@returns(200) {meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}, data: [map]} # Metric aggregates retrieved successfully\n@errors {401: Unauthorized, 404: Function not found, 422: Invalid function ID or query parameter, 500: Internal server error, 502: Metrics backend query failed, 503: Metrics backend unavailable, 504: Metrics backend timed out}\n\n@endpoint GET /compute/funcs/{id}/revisions\n@desc List function revisions\n@required {id: str # Function ID}\n@optional {page[number]: int=1, page[size]: int=10: any}\n@returns(200) {meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}, data: [map]} # Function revisions retrieved successfully\n@errors {400: Invalid function ID, 401: Unauthorized, 404: Function not found, 500: Internal server error}\n\n@endpoint GET /compute/funcs/{id}/ship_inspection\n@desc Inspect latest function ship\n@required {id: str # Function ID}\n@returns(200) {data: map{record_type: str, runtime: str, stage: str, reason: str, snippet: str, created_at: str(date-time)}} # Latest ship inspection\n@errors {404: Function or inspectable ship outcome not found, 422: Invalid function ID, 500: Internal server error}\n\n@endgroup\n\n@group conferences\n@endpoint GET /conferences\n@desc List conferences\n@optional {region: str(Australia/Europe/Middle East/US) # Region where the conference data is located, filter: map # Consolidated filter parameter (deepObject style). Originally: filter[application_name][contains], filter[outbound.outbound_voice_profile_id], filter[leg_id], filter[application_session_id], filter[connection_id], filter[product], filter[failed], filter[from], filter[to], filter[name], filter[type], filter[occurred_at][eq/gt/gte/lt/lte], filter[status], page: map # Consolidated page parameter (deepObject style). Originally: page[after], page[before], page[limit], page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of conferences.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /conferences\n@desc Create conference\n@required {call_control_id: str # Unique identifier and token for controlling the call, name: str # Name of the conference}\n@optional {beep_enabled: str(always/never/on_enter/on_exit)=never # Whether a beep sound should be played when participants join and/or leave the conference., client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string. The client_state will be updated for the creator call leg and will be used for all webhooks related to the created conference., comfort_noise: bool=true # Toggle background comfort noise., command_id: str # Use this field to avoid execution of duplicate commands. Telnyx will ignore subsequent commands with the same `command_id` as one that has already been executed., duration_minutes: int # Time length (minutes) after which the conference will end., hold_audio_url: str # The URL of a file to be played to participants joining the conference. The URL can point to either a WAV or MP3 file. hold_media_name and hold_audio_url cannot be used together in one request. Takes effect only when \"start_conference_on_create\" is set to \"false\"., hold_media_name: str # The media_name of a file to be played to participants joining the conference. The media_name must point to a file previously uploaded to api.telnyx.com/v2/media by the same user/organization. The file must either be a WAV or MP3 file. Takes effect only when \"start_conference_on_create\" is set to \"false\"., max_participants: int # The maximum number of active conference participants to allow. Must be between 2 and 800. Defaults to 250, start_conference_on_create: bool # Whether the conference should be started on creation. If the conference isn't started all participants that join are automatically put on hold. Defaults to \"true\"., region: str(Australia/Europe/Middle East/US) # Sets the region where the conference data will be hosted. Defaults to the region defined in user's data locality settings (Europe or US).}\n@returns(200) {data: map{record_type: str, id: str, name: str, created_at: str, expires_at: str, updated_at: str, region: str, status: str, end_reason: str, ended_by: map{call_control_id: str, call_session_id: str}, connection_id: str}} # Successful response with details about a conference.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint GET /conferences/{conference_id}/participants\n@desc List conference participants\n@required {conference_id: str # Uniquely identifies the conference by id}\n@optional {region: str(Australia/Europe/Middle East/US) # Region where the conference data is located, page: map # Consolidated page parameter (deepObject style). Originally: page[after], page[before], page[limit], page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[muted], filter[on_hold], filter[whispering]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of conference participants.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint GET /conferences/{id}\n@desc Retrieve a conference\n@required {id: str # Uniquely identifies the conference by id}\n@optional {region: str(Australia/Europe/Middle East/US) # Region where the conference data is located}\n@returns(200) {data: map{record_type: str, id: str, name: str, created_at: str, expires_at: str, updated_at: str, region: str, status: str, end_reason: str, ended_by: map{call_control_id: str, call_session_id: str}, connection_id: str}} # Successful response with details about a conference.\n@errors {404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found.}\n\n@endpoint POST /conferences/{id}/actions/end\n@desc End a conference\n@required {id: str(uuid) # Uniquely identifies the conference.}\n@optional {command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same conference.}\n@returns(200) {data: map{result: str}} # Successful response upon making a conference command.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /conferences/{id}/actions/gather_using_audio\n@desc Gather DTMF using audio prompt in a conference\n@required {id: str(uuid) # Uniquely identifies the conference., call_control_id: str # Unique identifier and token for controlling the call leg that will receive the gather prompt.}\n@optional {audio_url: str # The URL of the audio file to play as the gather prompt. Must be WAV or MP3 format., media_name: str # The name of the media file uploaded to the Media Storage API to play as the gather prompt., minimum_digits: int=1 # Minimum number of digits to gather., maximum_digits: int=128 # Maximum number of digits to gather., maximum_tries: int=3 # Maximum number of times to play the prompt if no input is received., timeout_millis: int=60000 # Duration in milliseconds to wait for input before timing out., terminating_digit: str=# # Digit that terminates gathering. Set to an empty string to disable the terminating digit entirely, so that a digit such as `#` can be collected as input per `valid_digits`., valid_digits: str=0123456789#* # Digits that are valid for gathering. All other digits will be ignored., inter_digit_timeout_millis: int=5000 # Duration in milliseconds to wait between digits., initial_timeout_millis: int # Duration in milliseconds to wait for the first digit before timing out., stop_playback_on_dtmf: bool=true # Whether to stop the audio playback when a DTMF digit is received., invalid_audio_url: str # URL of audio file to play when invalid input is received., invalid_media_name: str # Name of media file to play when invalid input is received., gather_id: str # Identifier for this gather command. Will be included in the gather ended webhook. Maximum 100 characters., client_state: str # Use this field to add state to every subsequent webhook. Must be a valid Base-64 encoded string.}\n@returns(200) {data: map{result: str}} # Successful response upon making a conference command.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /conferences/{id}/actions/hold\n@desc Hold conference participants\n@required {id: str # Uniquely identifies the conference by id or name}\n@optional {call_control_ids: [str] # List of unique identifiers and tokens for controlling the call. When empty all participants will be placed on hold., audio_url: str # The URL of a file to be played to the participants when they are put on hold. media_name and audio_url cannot be used together in one request., media_name: str # The media_name of a file to be played to the participants when they are put on hold. The media_name must point to a file previously uploaded to api.telnyx.com/v2/media by the same user/organization. The file must either be a WAV or MP3 file., region: str(Australia/Europe/Middle East/US) # Region where the conference data is located. Defaults to the region defined in user's data locality settings (Europe or US).}\n@returns(200) {data: map{result: str}} # Successful response upon making a conference command.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /conferences/{id}/actions/join\n@desc Join a conference\n@required {id: str # Uniquely identifies the conference by id or name, call_control_id: str # Unique identifier and token for controlling the call}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string. Please note that the client_state will be updated for the participient call leg and the change will not affect conferencing webhooks unless the participient is the owner of the conference., command_id: str # Use this field to avoid execution of duplicate commands. Telnyx will ignore subsequent commands with the same `command_id` as one that has already been executed., end_conference_on_exit: bool # Whether the conference should end and all remaining participants be hung up after the participant leaves the conference. Defaults to \"false\"., soft_end_conference_on_exit: bool # Whether the conference should end after the participant leaves the conference. NOTE this doesn't hang up the other participants. Defaults to \"false\"., hold: bool # Whether the participant should be put on hold immediately after joining the conference. Defaults to \"false\"., hold_audio_url: str # The URL of a file to be played to the participant when they are put on hold after joining the conference. hold_media_name and hold_audio_url cannot be used together in one request. Takes effect only when \"start_conference_on_create\" is set to \"false\". This property takes effect only if \"hold\" is set to \"true\"., hold_media_name: str # The media_name of a file to be played to the participant when they are put on hold after joining the conference. The media_name must point to a file previously uploaded to api.telnyx.com/v2/media by the same user/organization. The file must either be a WAV or MP3 file. Takes effect only when \"start_conference_on_create\" is set to \"false\". This property takes effect only if \"hold\" is set to \"true\"., mute: bool # Whether the participant should be muted immediately after joining the conference. Defaults to \"false\"., start_conference_on_enter: bool # Whether the conference should be started after the participant joins the conference. Defaults to \"false\"., supervisor_role: str(barge/monitor/none/whisper) # Sets the joining participant as a supervisor for the conference. A conference can have multiple supervisors. \"barge\" means the supervisor enters the conference as a normal participant. This is the same as \"none\". \"monitor\" means the supervisor is muted but can hear all participants. \"whisper\" means that only the specified \"whisper_call_control_ids\" can hear the supervisor. Defaults to \"none\"., whisper_call_control_ids: [str] # Array of unique call_control_ids the joining supervisor can whisper to. If none provided, the supervisor will join the conference as a monitoring participant only., beep_enabled: str(always/never/on_enter/on_exit) # Whether a beep sound should be played when the participant joins and/or leaves the conference. Can be used to override the conference-level setting., region: str(Australia/Europe/Middle East/US) # Region where the conference data is located. Defaults to the region defined in user's data locality settings (Europe or US).}\n@returns(200) {data: map{result: str}} # Successful response upon making a conference command.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /conferences/{id}/actions/leave\n@desc Leave a conference\n@required {id: str # Uniquely identifies the conference by id or name, call_control_id: str # Unique identifier and token for controlling the call}\n@optional {command_id: str # Use this field to avoid execution of duplicate commands. Telnyx will ignore subsequent commands with the same `command_id` as one that has already been executed., beep_enabled: str(always/never/on_enter/on_exit) # Whether a beep sound should be played when the participant leaves the conference. Can be used to override the conference-level setting., region: str(Australia/Europe/Middle East/US) # Region where the conference data is located. Defaults to the region defined in user's data locality settings (Europe or US).}\n@returns(200) {data: map{result: str}} # Successful response upon making a conference command.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /conferences/{id}/actions/mute\n@desc Mute conference participants\n@required {id: str # Uniquely identifies the conference by id or name}\n@optional {call_control_ids: [str] # Array of unique identifiers and tokens for controlling the call. When empty all participants will be muted., region: str(Australia/Europe/Middle East/US) # Region where the conference data is located. Defaults to the region defined in user's data locality settings (Europe or US).}\n@returns(200) {data: map{result: str}} # Successful response upon making a conference command.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /conferences/{id}/actions/play\n@desc Play audio to conference participants\n@required {id: str # Uniquely identifies the conference by id or name}\n@optional {audio_url: str # The URL of a file to be played back in the conference. media_name and audio_url cannot be used together in one request., media_name: str # The media_name of a file to be played back in the conference. The media_name must point to a file previously uploaded to api.telnyx.com/v2/media by the same user/organization. The file must either be a WAV or MP3 file., loop: any, call_control_ids: [str] # List of call control ids identifying participants the audio file should be played to. If not given, the audio file will be played to the entire conference., region: str(Australia/Europe/Middle East/US) # Region where the conference data is located. Defaults to the region defined in user's data locality settings (Europe or US).}\n@returns(200) {data: map{result: str}} # Successful response upon making a conference command.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /conferences/{id}/actions/record_pause\n@desc Conference recording pause\n@required {id: str # Specifies the conference by id or name}\n@optional {command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`., recording_id: str # Use this field to pause specific recording., region: str(Australia/Europe/Middle East/US) # Region where the conference data is located. Defaults to the region defined in user's data locality settings (Europe or US).}\n@returns(200) {data: map{result: str}} # Successful response upon making a conference command.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /conferences/{id}/actions/record_resume\n@desc Conference recording resume\n@required {id: str # Specifies the conference by id or name}\n@optional {command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`., recording_id: str # Use this field to resume specific recording., region: str(Australia/Europe/Middle East/US) # Region where the conference data is located. Defaults to the region defined in user's data locality settings (Europe or US).}\n@returns(200) {data: map{result: str}} # Successful response upon making a conference command.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /conferences/{id}/actions/record_start\n@desc Conference recording start\n@required {id: str # Specifies the conference to record by id or name, format: str(wav/mp3) # The audio file format used when storing the conference recording. Can be either `mp3` or `wav`.}\n@optional {command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `conference_id`., channels: str(single/dual)=single # When `dual`, final audio file will be stereo recorded with the conference creator on the first channel, and the rest on the second channel., play_beep: bool # If enabled, a beep sound will be played at the start of a recording., trim: str # When set to `trim-silence`, silence will be removed from the beginning and end of the recording., custom_file_name: str # The custom recording file name to be used instead of the default `call_leg_id`. Telnyx will still add a Unix timestamp suffix., region: str(Australia/Europe/Middle East/US) # Region where the conference data is located. Defaults to the region defined in user's data locality settings (Europe or US).}\n@returns(200) {data: map{result: str}} # Successful response upon making a conference command.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations., 503: Service unavailable. The recording could not be started because the recording service is temporarily unavailable. The recording was not started; retry the request.}\n\n@endpoint POST /conferences/{id}/actions/record_stop\n@desc Conference recording stop\n@required {id: str # Specifies the conference to stop the recording for by id or name}\n@optional {client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string., command_id: str # Use this field to avoid duplicate commands. Telnyx will ignore any command with the same `command_id` for the same `call_control_id`., recording_id: str(uuid) # Uniquely identifies the resource., region: str(Australia/Europe/Middle East/US) # Region where the conference data is located. Defaults to the region defined in user's data locality settings (Europe or US).}\n@returns(200) {data: map{result: str}} # Successful response upon making a conference command.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /conferences/{id}/actions/send_dtmf\n@desc Send DTMF to conference participants\n@required {id: str(uuid) # Uniquely identifies the conference., digits: str # DTMF digits to send. Valid characters: 0-9, A-D, *, #, w (0.5s pause), W (1s pause).}\n@optional {call_control_ids: [str] # Array of participant call control IDs to send DTMF to. When empty, DTMF will be sent to all participants., duration_millis: int=250 # Duration of each DTMF digit in milliseconds., client_state: str # Use this field to add state to every subsequent webhook. Must be a valid Base-64 encoded string.}\n@returns(200) {data: map{result: str}} # Successful response upon making a conference command.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /conferences/{id}/actions/speak\n@desc Speak text to conference participants\n@required {id: str # Specifies the conference by id or name, payload: str # The text or SSML to be converted into speech. There is a 3,000 character limit., voice: str # Specifies the voice used in speech synthesis.  - Define voices using the format `..`. Specifying only the provider will give default values for voice_id and model_id.   **Supported Providers:** - **AWS:** Use `AWS.Polly.` (e.g., `AWS.Polly.Joanna`). For neural voices, which provide more realistic, human-like speech, append `-Neural` to the `VoiceId` (e.g., `AWS.Polly.Joanna-Neural`). Check the [available voices](https://docs.aws.amazon.com/polly/latest/dg/available-voices.html) for compatibility. - **Azure:** Use `Azure.` (e.g., `Azure.en-CA-ClaraNeural`, `Azure.en-US-BrianMultilingualNeural`, `Azure.en-US-Ava:DragonHDLatestNeural`). For a complete list of voices, go to [Azure Voice Gallery](https://speech.microsoft.com/portal/voicegallery). Use `voice_settings` to configure custom deployments, regions, or API keys. - **ElevenLabs:** Use `ElevenLabs..` (e.g., `ElevenLabs.eleven_multilingual_v2.21m00Tcm4TlvDq8ikWAM`). The `ModelId` part is optional. To use ElevenLabs, you must provide your ElevenLabs API key as an integration identifier secret in `\"voice_settings\": {\"api_key_ref\": \"\"}`. See [integration secrets documentation](https://developers.telnyx.com/api/secrets-manager/integration-secrets/create-integration-secret) for details. Check [available voices](https://elevenlabs.io/docs/api-reference/get-voices). - **Telnyx:** Use `Telnyx..` (e.g., `Telnyx.KokoroTTS.af`). Use `voice_settings` to configure voice_speed and other synthesis parameters. `Bayan` provides Arabic (multiple dialects) and English voices (e.g., `Telnyx.Bayan.Ahmed`, `Telnyx.Bayan.Amanda`). `Sukhan` provides Urdu voices (e.g., `Telnyx.Sukhan.urdu-professor`); `voice_speed` is not supported. - **Minimax:** Use `Minimax..` (e.g., `Minimax.speech-02-hd.Wise_Woman`). Supported models: `speech-02-turbo`, `speech-02-hd`, `speech-2.6-turbo`, `speech-2.8-turbo`. Use `voice_settings` to configure speed, volume, pitch, and language_boost. - **Resemble:** Use `Resemble.Turbo.` (e.g., `Resemble.Turbo.my_voice`). Only `Turbo` model is supported. Use `voice_settings` to configure precision, sample_rate, and format. - **Inworld:** Use `Inworld..` (e.g., `Inworld.Mini.Loretta`, `Inworld.Max.Oliver`, `Inworld.TTS2.Loretta`). Supported models: `Mini`, `Max`, `TTS2`. Use `voice_settings` to configure `delivery_mode` (`STABLE`, `BALANCED`, `CREATIVE`), supported by `TTS2` only. - **Fish Audio:** Use `FishAudio..` (e.g., `FishAudio.s2.1-pro.`). Supported models: `s2.1-pro`, `s2-pro`, `s1`. `VoiceId` is a Fish Voice-Library reference ID. - **Soniox:** Use `Soniox..` (e.g., `Soniox.tts-rt-v2.Emma`). Supported model: `tts-rt-v2`. Browse the catalog via the [Voices API](https://developers.telnyx.com/api-reference/text-to-speech-commands/list-available-voices). Every voice speaks all supported languages; set `language` to the two-letter ISO 639-1 code of the text, for example `it`. SSML is not supported. Use `voice_settings` to configure `speed` (0.7 to 1.3) and `reduce_silence`. - **xAI:** Use `xAI.` (e.g., `xAI.eve`). Available voices: `eve`, `ara`, `rex`, `sal`, `leo`. - **Humain:** Use `Humain.` (e.g., `Humain.sara-ar`). Available voices: `sara-en`, `abdulaziz-en`, `sara-ar`, `abdulaziz-ar`, `nourah-ar`, `abdullah-ar`. Native Arabic (Saudi dialect) and English voices only — no `ModelId` segment.  For service_level basic, you may define the gender of the speaker (male or female).}\n@optional {call_control_ids: [str] # Call Control IDs of participants who will hear the spoken text. When empty all participants will hear the spoken text., payload_type: str(text/ssml)=text # The type of the provided payload. The payload can either be plain text, or Speech Synthesis Markup Language (SSML)., voice_settings: any # The settings associated with the voice selected, language: str(arb/cmn-CN/cy-GB/da-DK/de-DE/en-AU/en-GB/en-GB-WLS/en-IN/en-US/es-ES/es-MX/es-US/fr-CA/fr-FR/hi-IN/is-IS/it-IT/ja-JP/ko-KR/nb-NO/nl-NL/pl-PL/pt-BR/pt-PT/ro-RO/ru-RU/sv-SE/tr-TR) # The language you want spoken. This parameter is ignored when a `Polly.*` voice is specified., command_id: str # Use this field to avoid execution of duplicate commands. Telnyx will ignore subsequent commands with the same `command_id` as one that has already been executed., region: str(Australia/Europe/Middle East/US) # Region where the conference data is located. Defaults to the region defined in user's data locality settings (Europe or US).}\n@returns(200) {data: map{result: str}} # Successful response upon making a conference command.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /conferences/{id}/actions/stop\n@desc Stop audio being played on the conference\n@required {id: str # Uniquely identifies the conference by id or name}\n@optional {call_control_ids: [str] # List of call control ids identifying participants the audio file should stop be played to. If not given, the audio will be stoped to the entire conference., region: str(Australia/Europe/Middle East/US) # Region where the conference data is located. Defaults to the region defined in user's data locality settings (Europe or US).}\n@returns(200) {data: map{result: str}} # Successful response upon making a conference command.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /conferences/{id}/actions/unhold\n@desc Unhold conference participants\n@required {id: str # Uniquely identifies the conference by id or name, call_control_ids: [str] # List of unique identifiers and tokens for controlling the call. Enter each call control ID to be unheld.}\n@optional {region: str(Australia/Europe/Middle East/US) # Region where the conference data is located. Defaults to the region defined in user's data locality settings (Europe or US).}\n@returns(200) {data: map{result: str}} # Successful response upon making a conference command.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /conferences/{id}/actions/unmute\n@desc Unmute conference participants\n@required {id: str # Uniquely identifies the conference by id or name}\n@optional {call_control_ids: [str] # List of unique identifiers and tokens for controlling the call. Enter each call control ID to be unmuted. When empty all participants will be unmuted., region: str(Australia/Europe/Middle East/US) # Region where the conference data is located. Defaults to the region defined in user's data locality settings (Europe or US).}\n@returns(200) {data: map{result: str}} # Successful response upon making a conference command.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /conferences/{id}/actions/update\n@desc Update conference participant\n@required {id: str # Uniquely identifies the conference by id or name, call_control_id: str # Unique identifier and token for controlling the call, supervisor_role: str(barge/monitor/none/whisper) # Sets the participant as a supervisor for the conference. A conference can have multiple supervisors. \"barge\" means the supervisor enters the conference as a normal participant. This is the same as \"none\". \"monitor\" means the supervisor is muted but can hear all participants. \"whisper\" means that only the specified \"whisper_call_control_ids\" can hear the supervisor. Defaults to \"none\".}\n@optional {command_id: str # Use this field to avoid execution of duplicate commands. Telnyx will ignore subsequent commands with the same `command_id` as one that has already been executed., whisper_call_control_ids: [str] # Array of unique call_control_ids the supervisor can whisper to. If none provided, the supervisor will join the conference as a monitoring participant only., region: str(Australia/Europe/Middle East/US) # Region where the conference data is located. Defaults to the region defined in user's data locality settings (Europe or US).}\n@returns(200) {data: map{result: str}} # Successful response upon making a conference command.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint GET /conferences/{id}/participants/{participant_id}\n@desc Retrieve a conference participant\n@required {id: str(uuid) # Uniquely identifies the conference., participant_id: str # Uniquely identifies the participant by their ID or label.}\n@returns(200) {data: map{id: str, call_control_id: str, call_leg_id: str, conference_id: str, label: str, status: str, muted: bool, on_hold: bool, whisper_call_control_ids: [str], created_at: str(date-time), updated_at: str(date-time), end_conference_on_exit: bool, soft_end_conference_on_exit: bool}} # Successful response\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint PATCH /conferences/{id}/participants/{participant_id}\n@desc Update a conference participant\n@required {id: str(uuid) # Uniquely identifies the conference., participant_id: str # Uniquely identifies the participant.}\n@optional {end_conference_on_exit: bool # Whether the conference should end when this participant exits., soft_end_conference_on_exit: bool # Whether the conference should soft-end when this participant exits. A soft end will stop new participants from joining but allow existing participants to remain., beep_enabled: str(always/never/on_enter/on_exit) # Whether entry/exit beeps are enabled for this participant.}\n@returns(200) {data: map{id: str, call_control_id: str, call_leg_id: str, conference_id: str, label: str, status: str, muted: bool, on_hold: bool, whisper_call_control_ids: [str], created_at: str(date-time), updated_at: str(date-time), end_conference_on_exit: bool, soft_end_conference_on_exit: bool}} # Successful response\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endgroup\n\n@group connections\n@endpoint GET /connections\n@desc List connections\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[connection_name], filter[fqdn], filter[outbound_voice_profile_id], filter[outbound.outbound_voice_profile_id], page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], sort: str(created_at/connection_name/active)=created_at # Specifies the sort order for results. By default sorting direction is ascending. To have the results sorted in descending order add the  - prefix. That is:         connection_name: sorts the result by the     connection_name field in ascending order.            -connection_name: sorts the result by the     connection_name field in descending order.      If not given, results are sorted by created_at in descending order.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of connections.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action.}\n\n@endpoint GET /connections/count\n@desc Count connections\n@returns(200) {data: map{record_type: str, counts: map{ip_connections: int, credential_connections: int, uac_connections: int, fqdn_connections: int, call_control_applications: int, texml_applications: int, third_party_provider_connections: int, external_connections: int, fax_connections: int, mobile_voice_connections: int, microsoft_teams_sbc_connections: int, zoom_sbc_connections: int, operator_connect_connections: int}, limits: map}} # Successful response with connection counts and limits.\n@errors {401: Unauthorized}\n\n@endpoint GET /connections/{connection_id}/active_calls\n@desc List all active calls for given connection\n@required {connection_id: str # Telnyx connection id}\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[after], page[before], page[limit], page[size], page[number]}\n@returns(200) {data: [map], meta: map{cursors: map{after: str, before: str}, total_items: int, next: str, previous: str}} # Successful response with list of details about active calls.\n@errors {422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint GET /connections/{id}\n@desc Retrieve a connection\n@required {id: str # IP Connection ID}\n@returns(200) {data: map{id: str, record_type: str, active: bool, anchorsite_override: str, connection_name: str, created_at: str, updated_at: str, webhook_event_url: str(uri)?, webhook_event_failover_url: str(uri)?, webhook_api_version: str, outbound_voice_profile_id: str, tags: [str]}} # Successful response with details about a connection.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist.}\n\n@endgroup\n\n@group country_coverage\n@endpoint GET /country_coverage\n@desc Get country coverage\n@returns(200) {data: map} # Response for country coverage\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /country_coverage/countries/{country_code}\n@desc Get coverage for a specific country\n@required {country_code: str # Country ISO code.}\n@returns(200) {data: map{code: str, numbers: bool, features: [str], phone_number_type: [str], reservable: bool, quickship: bool, international_sms: bool, p2p: bool, local: map{features: [str], reservable: bool, quickship: bool, international_sms: bool, p2p: bool, full_pstn_replacement: bool}, toll_free: map{features: [str], reservable: bool, quickship: bool, international_sms: bool, p2p: bool, full_pstn_replacement: bool}, mobile: map, national: map, inventory_coverage: bool, shared_cost: map, region: str?}} # Response for specific country coverage\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group credential_connections\n@endpoint GET /credential_connections\n@desc List credential connections\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[connection_name], filter[fqdn], filter[outbound_voice_profile_id], filter[outbound.outbound_voice_profile_id], page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], sort: str(created_at/connection_name/active)=created_at # Specifies the sort order for results. By default sorting direction is ascending. To have the results sorted in descending order add the  - prefix. That is:         connection_name: sorts the result by the     connection_name field in ascending order.            -connection_name: sorts the result by the     connection_name field in descending order.      If not given, results are sorted by created_at in descending order.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of credential connections.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action.}\n\n@endpoint POST /credential_connections\n@desc Create a credential connection\n@required {user_name: str # The user name to be used as part of the credentials. Must be 4-32 characters long and alphanumeric values only (no spaces or special characters)., password: str # The password to be used as part of the credentials. Must be 8 to 128 characters long., connection_name: str # A user-assigned name to help manage the connection.}\n@optional {active: bool # Defaults to true, anchorsite_override: str(Latency/Chicago, IL/Ashburn, VA/San Jose, CA/Sydney, Australia/Amsterdam, Netherlands/London, UK/Toronto, Canada/Vancouver, Canada/Frankfurt, Germany)=Latency # `Latency` directs Telnyx to route media through the site with the lowest round-trip time to the user's connection. Telnyx calculates this time using ICMP ping messages. This can be disabled by specifying a site to handle all media., sip_uri_calling_preference: str(disabled/unrestricted/internal) # This feature enables inbound SIP URI calls to your Credential Auth Connection. If enabled for all (unrestricted) then anyone who calls the SIP URI @telnyx.com will be connected to your Connection. You can also choose to allow only calls that are originated on any Connections under your account (internal)., default_on_hold_comfort_noise_enabled: bool=false # When enabled, Telnyx will generate comfort noise when you place the call on hold. If disabled, you will need to generate comfort noise or on hold music to avoid RTP timeout., dtmf_type: str(RFC 2833/Inband/SIP INFO)=RFC 2833 # Sets the type of DTMF digits sent from Telnyx to this Connection. Note that DTMF digits sent to Telnyx will be accepted in all formats., encode_contact_header_enabled: bool=false # Encode the SIP contact header sent by Telnyx to avoid issues for NAT or ALG scenarios., encrypted_media: str # Enable use of SRTP for encryption. Cannot be set if the transport_portocol is TLS., onnet_t38_passthrough_enabled: bool=false # Enable on-net T38 if you prefer the sender and receiver negotiating T38 directly if both are on the Telnyx network. If this is disabled, Telnyx will be able to use T38 on just one leg of the call depending on each leg's settings., ios_push_credential_id: str=null # The uuid of the push credential for Ios, android_push_credential_id: str=null # The uuid of the push credential for Android, webhook_event_url: str(uri) # The URL where webhooks related to this connection will be sent. Must include a scheme, such as 'https'., webhook_event_failover_url: str(uri)= # The failover URL where webhooks related to this connection will be sent if sending to the primary URL fails. Must include a scheme, such as 'https'., webhook_api_version: str(1/2/texml)=1 # Determines which webhook format will be used, Telnyx API v1, v2 or texml. Note - texml can only be set when the outbound object parameter call_parking_enabled is included and set to true., webhook_timeout_secs: int=null # Specifies how many seconds to wait before timing out a webhook., call_cost_in_webhooks: bool=false # Specifies if call cost webhooks should be sent for this connection., tags: [str] # Tags associated with the connection., rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_routing_method: str, channel_limit: int, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool, simultaneous_ringing: str}, outbound: map{call_parking_enabled: bool, ani_override: str, ani_override_type: str, channel_limit: int, instant_ringback_enabled: bool, generate_ringback_tone: bool, localization: str, t38_reinvite_source: str, outbound_voice_profile_id: str}, noise_suppression: str(inbound/outbound/both/disabled) # Controls when noise suppression is applied to calls. When set to 'inbound', noise suppression is applied to incoming audio. When set to 'outbound', it's applied to outgoing audio. When set to 'both', it's applied in both directions. When set to 'disabled', noise suppression is turned off., noise_suppression_details: map{engine: str, attenuation_limit: int} # Configuration options for noise suppression. These settings are stored regardless of the noise_suppression value, but only take effect when noise_suppression is not 'disabled'. If you disable noise suppression and later re-enable it, the previously configured settings will be used., jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int} # Configuration options for Jitter Buffer. Enables Jitter Buffer for RTP streams of SIP Trunking calls. The feature is off unless enabled. You may define min and max values in msec for customized buffering behaviors. Larger values add latency but tolerate more jitter, while smaller values reduce latency but are more sensitive to jitter and reordering.}\n@returns(201) {data: map{id: str, record_type: str, active: bool, conversation_persistence: bool, user_name: str, password: str, created_at: str, updated_at: str, anchorsite_override: str, connection_name: str, sip_uri_calling_preference: str, default_on_hold_comfort_noise_enabled: bool, dtmf_type: str, encode_contact_header_enabled: bool, encrypted_media: str?, onnet_t38_passthrough_enabled: bool, ios_push_credential_id: str?, android_push_credential_id: str?, webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_api_version: str, webhook_timeout_secs: int?, call_cost_in_webhooks: bool, tags: [str], rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_routing_method: str, channel_limit: int, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool, simultaneous_ringing: str}, outbound: map{call_parking_enabled: bool?, ani_override: str, ani_override_type: str, channel_limit: int, instant_ringback_enabled: bool, generate_ringback_tone: bool, localization: str, t38_reinvite_source: str, outbound_voice_profile_id: str}, noise_suppression: str, noise_suppression_details: map{engine: str, attenuation_limit: int}, jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int}}} # Successful response with details about a credential connection.\n@errors {401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 422: The request was well-formed but was unable to be followed due to semantic errors.}\n\n@endpoint DELETE /credential_connections/{id}\n@desc Delete a credential connection\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{id: str, record_type: str, active: bool, conversation_persistence: bool, user_name: str, password: str, created_at: str, updated_at: str, anchorsite_override: str, connection_name: str, sip_uri_calling_preference: str, default_on_hold_comfort_noise_enabled: bool, dtmf_type: str, encode_contact_header_enabled: bool, encrypted_media: str?, onnet_t38_passthrough_enabled: bool, ios_push_credential_id: str?, android_push_credential_id: str?, webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_api_version: str, webhook_timeout_secs: int?, call_cost_in_webhooks: bool, tags: [str], rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_routing_method: str, channel_limit: int, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool, simultaneous_ringing: str}, outbound: map{call_parking_enabled: bool?, ani_override: str, ani_override_type: str, channel_limit: int, instant_ringback_enabled: bool, generate_ringback_tone: bool, localization: str, t38_reinvite_source: str, outbound_voice_profile_id: str}, noise_suppression: str, noise_suppression_details: map{engine: str, attenuation_limit: int}, jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int}}} # Successful response with details about a credential connection.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist.}\n\n@endpoint GET /credential_connections/{id}\n@desc Retrieve a credential connection\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{id: str, record_type: str, active: bool, conversation_persistence: bool, user_name: str, password: str, created_at: str, updated_at: str, anchorsite_override: str, connection_name: str, sip_uri_calling_preference: str, default_on_hold_comfort_noise_enabled: bool, dtmf_type: str, encode_contact_header_enabled: bool, encrypted_media: str?, onnet_t38_passthrough_enabled: bool, ios_push_credential_id: str?, android_push_credential_id: str?, webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_api_version: str, webhook_timeout_secs: int?, call_cost_in_webhooks: bool, tags: [str], rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_routing_method: str, channel_limit: int, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool, simultaneous_ringing: str}, outbound: map{call_parking_enabled: bool?, ani_override: str, ani_override_type: str, channel_limit: int, instant_ringback_enabled: bool, generate_ringback_tone: bool, localization: str, t38_reinvite_source: str, outbound_voice_profile_id: str}, noise_suppression: str, noise_suppression_details: map{engine: str, attenuation_limit: int}, jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int}}} # Successful response with details about a credential connection.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist.}\n\n@endpoint PATCH /credential_connections/{id}\n@desc Update a credential connection\n@required {id: str # Identifies the resource.}\n@optional {active: bool # Defaults to true, conversation_persistence: bool # Whether conversation persistence is enabled for this connection. When enabled, calls handled by the connection are transcribed, stored, and indexed. Defaults to false., user_name: str # The user name to be used as part of the credentials. Must be 4-32 characters long and alphanumeric values only (no spaces or special characters)., password: str # The password to be used as part of the credentials. Must be 8 to 128 characters long., anchorsite_override: str(Latency/Chicago, IL/Ashburn, VA/San Jose, CA/Sydney, Australia/Amsterdam, Netherlands/London, UK/Toronto, Canada/Vancouver, Canada/Frankfurt, Germany)=Latency # `Latency` directs Telnyx to route media through the site with the lowest round-trip time to the user's connection. Telnyx calculates this time using ICMP ping messages. This can be disabled by specifying a site to handle all media., connection_name: str # A user-assigned name to help manage the connection., sip_uri_calling_preference: str(disabled/unrestricted/internal) # This feature enables inbound SIP URI calls to your Credential Auth Connection. If enabled for all (unrestricted) then anyone who calls the SIP URI @telnyx.com will be connected to your Connection. You can also choose to allow only calls that are originated on any Connections under your account (internal)., default_on_hold_comfort_noise_enabled: bool=false # When enabled, Telnyx will generate comfort noise when you place the call on hold. If disabled, you will need to generate comfort noise or on hold music to avoid RTP timeout., dtmf_type: str(RFC 2833/Inband/SIP INFO)=RFC 2833 # Sets the type of DTMF digits sent from Telnyx to this Connection. Note that DTMF digits sent to Telnyx will be accepted in all formats., encode_contact_header_enabled: bool=false # Encode the SIP contact header sent by Telnyx to avoid issues for NAT or ALG scenarios., encrypted_media: str # Enable use of SRTP for encryption. Cannot be set if the transport_portocol is TLS., onnet_t38_passthrough_enabled: bool=false # Enable on-net T38 if you prefer the sender and receiver negotiating T38 directly if both are on the Telnyx network. If this is disabled, Telnyx will be able to use T38 on just one leg of the call depending on each leg's settings., ios_push_credential_id: str=null # The uuid of the push credential for Ios, android_push_credential_id: str=null # The uuid of the push credential for Android, webhook_event_url: str(uri) # The URL where webhooks related to this connection will be sent. Must include a scheme, such as 'https'., webhook_event_failover_url: str(uri)= # The failover URL where webhooks related to this connection will be sent if sending to the primary URL fails. Must include a scheme, such as 'https'., webhook_api_version: str(1/2)=1 # Determines which webhook format will be used, Telnyx API v1 or v2., webhook_timeout_secs: int=null # Specifies how many seconds to wait before timing out a webhook., call_cost_in_webhooks: bool=false # Specifies if call cost webhooks should be sent for this connection., tags: [str] # Tags associated with the connection., rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_routing_method: str, channel_limit: int, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool, simultaneous_ringing: str}, outbound: map{call_parking_enabled: bool, ani_override: str, ani_override_type: str, channel_limit: int, instant_ringback_enabled: bool, generate_ringback_tone: bool, localization: str, t38_reinvite_source: str, outbound_voice_profile_id: str}, noise_suppression: str(inbound/outbound/both/disabled) # Controls when noise suppression is applied to calls. When set to 'inbound', noise suppression is applied to incoming audio. When set to 'outbound', it's applied to outgoing audio. When set to 'both', it's applied in both directions. When set to 'disabled', noise suppression is turned off., noise_suppression_details: map{engine: str, attenuation_limit: int} # Configuration options for noise suppression. These settings are stored regardless of the noise_suppression value, but only take effect when noise_suppression is not 'disabled'. If you disable noise suppression and later re-enable it, the previously configured settings will be used., jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int} # Configuration options for Jitter Buffer. Enables Jitter Buffer for RTP streams of SIP Trunking calls. The feature is off unless enabled. You may define min and max values in msec for customized buffering behaviors. Larger values add latency but tolerate more jitter, while smaller values reduce latency but are more sensitive to jitter and reordering.}\n@returns(200) {data: map{id: str, record_type: str, active: bool, conversation_persistence: bool, user_name: str, password: str, created_at: str, updated_at: str, anchorsite_override: str, connection_name: str, sip_uri_calling_preference: str, default_on_hold_comfort_noise_enabled: bool, dtmf_type: str, encode_contact_header_enabled: bool, encrypted_media: str?, onnet_t38_passthrough_enabled: bool, ios_push_credential_id: str?, android_push_credential_id: str?, webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_api_version: str, webhook_timeout_secs: int?, call_cost_in_webhooks: bool, tags: [str], rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_routing_method: str, channel_limit: int, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool, simultaneous_ringing: str}, outbound: map{call_parking_enabled: bool?, ani_override: str, ani_override_type: str, channel_limit: int, instant_ringback_enabled: bool, generate_ringback_tone: bool, localization: str, t38_reinvite_source: str, outbound_voice_profile_id: str}, noise_suppression: str, noise_suppression_details: map{engine: str, attenuation_limit: int}, jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int}}} # Successful response with details about a credential connection.\n@errors {401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist., 409: Conflict. Another update to this credential connection is still in progress. Wait and retry the request later., 422: The request was well-formed but was unable to be followed due to semantic errors.}\n\n@endpoint POST /credential_connections/{id}/actions/check_registration_status\n@desc Check a Credential Connection Registration Status\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{record_type: str, status: str, sip_username: str?, ip_address: str?, transport: str?, port: int?, user_agent: str?, last_registration: str?}} # Successful response with details about a credential connection registration status.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist.}\n\n@endgroup\n\n@group custom_storage_credentials\n@endpoint DELETE /custom_storage_credentials/{connection_id}\n@desc Delete a stored credential\n@required {connection_id: str # Uniquely identifies a Telnyx application (Call Control, TeXML) or Sip connection resource.}\n@returns(204) The credentials configuration for connection_id was deleted successfully.\n@errors {401: Unauthorized. The request lacks valid authentication credentials., 404: Resource not found. The requested resource or URL could not be found.}\n\n@endpoint GET /custom_storage_credentials/{connection_id}\n@desc Retrieve a stored credential\n@required {connection_id: str # Uniquely identifies a Telnyx application (Call Control, TeXML) or Sip connection resource.}\n@returns(200) {data: map{backend: str, configuration: any}, connection_id: str, record_type: str} # A response containing a credentials resource.\n@errors {401: Unauthorized. The request lacks valid authentication credentials., 404: Resource not found. The requested resource or URL could not be found.}\n\n@endpoint POST /custom_storage_credentials/{connection_id}\n@desc Create a custom storage credential\n@required {connection_id: str # Uniquely identifies a Telnyx application (Call Control, TeXML) or Sip connection resource., backend: str(gcs/s3/s3-generic/azure), configuration: any}\n@returns(200) {data: map{backend: str, configuration: any}, connection_id: str, record_type: str} # A response containing a credentials resource.\n@errors {401: Unauthorized. The request lacks valid authentication credentials., 404: Resource not found. The requested resource or URL could not be found.}\n\n@endpoint PUT /custom_storage_credentials/{connection_id}\n@desc Update a stored credential\n@required {connection_id: str # Uniquely identifies a Telnyx application (Call Control, TeXML) or Sip connection resource., backend: str(gcs/s3/s3-generic/azure), configuration: any}\n@returns(200) {data: map{backend: str, configuration: any}, connection_id: str, record_type: str} # A response containing a credentials resource.\n@errors {401: Unauthorized. The request lacks valid authentication credentials., 404: Resource not found. The requested resource or URL could not be found.}\n\n@endgroup\n\n@group customer_service_records\n@endpoint GET /customer_service_records\n@desc List customer service records\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[phone_number][eq], filter[phone_number][in][], filter[status][eq], filter[status][in][], filter[created_at][lt], filter[created_at][gt], sort: map # Consolidated sort parameter (deepObject style). Originally: sort[value]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {401: The required authentication headers were either invalid or not included in the request., 403: You do not have permission to perform the requested action on the specified resource or resources., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: An unexpected error occurred.}\n\n@endpoint POST /customer_service_records\n@desc Create a customer service record\n@required {phone_number: str # A valid US phone number in E164 format.}\n@optional {webhook_url: str # Callback URL to receive webhook notifications., additional_data: map{name: str, authorized_person_name: str, pin: str, account_number: str, customer_code: str, address_line_1: str, city: str, state: str, zip_code: str, billing_phone_number: str}}\n@returns(201) {data: map{id: str(uuid), phone_number: str, status: str, error_message: str?, result: map?, webhook_url: str, record_type: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful Response\n@errors {401: The required authentication headers were either invalid or not included in the request., 403: You do not have permission to perform the requested action on the specified resource or resources., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: An unexpected error occurred.}\n\n@endpoint POST /customer_service_records/phone_number_coverages\n@desc Verify CSR phone number coverage\n@required {phone_numbers: [str] # The phone numbers list to be verified.}\n@returns(201) {data: [map]} # Successful Response\n@errors {401: The required authentication headers were either invalid or not included in the request., 403: You do not have permission to perform the requested action on the specified resource or resources., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: An unexpected error occurred.}\n\n@endpoint GET /customer_service_records/{customer_service_record_id}\n@desc Get a customer service record\n@required {customer_service_record_id: str # The ID of the customer service record}\n@returns(200) {data: map{id: str(uuid), phone_number: str, status: str, error_message: str?, result: map?, webhook_url: str, record_type: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful Response\n@errors {401: The required authentication headers were either invalid or not included in the request., 403: You do not have permission to perform the requested action on the specified resource or resources., 404: Resource not found, 500: An unexpected error occurred.}\n\n@endgroup\n\n@group detail_records\n@endpoint GET /detail_records\n@desc Search detail records\n@optional {filter: map # Filter records on a given record attribute and value. Example: filter[status]=delivered. Required: filter[record_type] must be specified. The valid filter fields depend on the record_type: filtering by a field that does not exist for the selected record_type is rejected with a 400 error. Call-control and sip-trunking records use started_at, finished_at and answered_at (they have no created_at); messaging records use created_at. To list the fields available for a record_type, use the /v2/detail_records/options endpoint., sort: [str] # Specifies the sort order for results. Example: sort=-created_at The valid sort fields depend on the record_type: sort by a field that does not exist for the selected record_type is rejected with a 400 error. Call-control and sip-trunking records use started_at, finished_at and answered_at (they have no created_at); messaging records use created_at. To list the fields available for a record_type, use the /v2/detail_records/options endpoint., page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int(int32), total_results: int(int32), page_number: int(int32), page_size: int(int32)}} # Successful\n@errors {400: Bad Request}\n\n@endgroup\n\n@group dialogflow_connections\n@endpoint DELETE /dialogflow_connections/{connection_id}\n@desc Delete stored Dialogflow Connection\n@required {connection_id: str # Uniquely identifies a Telnyx application (Call Control).}\n@returns(204) The Dialogflow Connection for connection_id was deleted successfully.\n@errors {404: Resource not found. The requested resource or URL could not be found.}\n\n@endpoint GET /dialogflow_connections/{connection_id}\n@desc Retrieve stored Dialogflow Connection\n@required {connection_id: str # Uniquely identifies a Telnyx application (Call Control).}\n@returns(200) {data: map{record_type: str, connection_id: str, conversation_profile_id: str, environment: str, service_account: str}} # Return details of the Dialogflow connection associated with the given CallControl connection.\n@errors {404: Resource not found. The requested resource or URL could not be found.}\n\n@endpoint POST /dialogflow_connections/{connection_id}\n@desc Create a Dialogflow Connection\n@required {connection_id: str # Uniquely identifies a Telnyx application (Call Control)., service_account: map # The JSON map to connect your Dialoglow account.}\n@optional {dialogflow_api: str(cx/es)=es # Determine which Dialogflow will be used., conversation_profile_id: str # The id of a configured conversation profile on your Dialogflow account. (If you use Dialogflow CX, this param is required), location: str # The region of your agent is. (If you use Dialogflow CX, this param is required), environment: str # Which Dialogflow environment will be used.}\n@returns(201) {data: map{record_type: str, connection_id: str, conversation_profile_id: str, environment: str, service_account: str}} # Return details of the Dialogflow connection associated with the given CallControl connection.\n@errors {422: Unprocessable entity. The request was well-formed but contains semantic errors.}\n\n@endpoint PUT /dialogflow_connections/{connection_id}\n@desc Update stored Dialogflow Connection\n@required {connection_id: str # Uniquely identifies a Telnyx application (Call Control)., service_account: map # The JSON map to connect your Dialoglow account.}\n@optional {dialogflow_api: str(cx/es)=es # Determine which Dialogflow will be used., conversation_profile_id: str # The id of a configured conversation profile on your Dialogflow account. (If you use Dialogflow CX, this param is required), location: str # The region of your agent is. (If you use Dialogflow CX, this param is required), environment: str # Which Dialogflow environment will be used.}\n@returns(200) {data: map{record_type: str, connection_id: str, conversation_profile_id: str, environment: str, service_account: str}} # Return details of the Dialogflow connection associated with the given CallControl connection.\n@errors {404: Resource not found. The requested resource or URL could not be found., 422: Unprocessable entity. The request was well-formed but contains semantic errors.}\n\n@endgroup\n\n@group dir\n@endpoint GET /dir\n@desc List all DIRs across your enterprises\n@optional {page[number]: int=1: any # 1-based page number. Out-of-range values return an empty page with correct meta., page[size]: int=20 # Items per page. Maximum 250; values above are clamped to 250., sort: str(created_at/-created_at/updated_at/-updated_at/display_name/-display_name/status/-status)=-created_at # Sort field. Allowed values: `created_at`, `updated_at`, `display_name`, `status`. Prefix with `-` for descending. Default `-created_at`., filter[expiring_at][gte]: str(date-time) # Return only DIRs whose `expiring_at` is at or after this ISO-8601 timestamp. Pairs with the `[lte]` variant to build renewal-window dashboards., filter[expiring_at][lte]: str(date-time) # Return only DIRs whose `expiring_at` is at or before this ISO-8601 timestamp., filter[enterprise_id]: str(uuid) # Filter by enterprise ID., filter[status]: str # Filter by DIR status., filter[display_name][contains]: str # Case-insensitive partial match on display name., filter[call_reason][contains]: str # Case-insensitive partial match on call reason.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Paginated list of DIRs across all your enterprises.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint GET /dir/document_types\n@desc List supported DIR document types\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # List of supported document types.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint DELETE /dir/{dir_id}\n@desc Delete a DIR\n@required {dir_id: str(uuid) # The DIR id. Lowercase UUID.}\n@returns(204) DIR deleted.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint GET /dir/{dir_id}\n@desc Get a DIR by id\n@required {dir_id: str(uuid) # The DIR id. Lowercase UUID.}\n@returns(200) {data: map{id: str(uuid), enterprise_id: str(uuid), display_name: str, reselling: bool, certify_brand_is_accurate: bool, certify_no_shaft_content: bool, certify_ip_ownership: bool, authorizer_name: str?, authorizer_email: str(email)?, logo_url: str(uri)?, call_reasons: [map], documents: [map]?, status: str, rejection_reasons: [map]?, rejected_at: str(date-time)?, created_at: str(date-time), updated_at: str(date-time), submitted_at: str(date-time)?, verified_at: str(date-time)?, expiring_at: str(date-time)?}} # DIR.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint PATCH /dir/{dir_id}\n@desc Update a DIR\n@required {dir_id: str(uuid) # The DIR id. Lowercase UUID.}\n@optional {display_name: str # Name shown to call recipients. 1–35 characters, no emoji, not whitespace-only., reselling: bool # Set to true if your organization places calls on behalf of other enterprises (BPO/reseller). Updating this triggers re-vetting on next submit., authorizer_name: str # Name of the person at your enterprise authorizing this DIR. Must be a real individual., authorizer_email: str(email) # Contact email of the authorizer. Telnyx may send verification or infringement notices here., logo_url: str(uri) # Publicly accessible HTTPS URL (max 128 chars) to a 256x256 BMP logo (max 1 MB)., call_reasons: [str] # 1–10 reasons your business calls customers. Validate phrasing against `POST /call_reasons/validate`., certify_brand_is_accurate: bool # Certification that the DIR information is accurate. Must be `true` for the DIR to be submitted for vetting., certify_no_shaft_content: bool # Certification that this DIR is not used for SHAFT content (Sex, Hate, Alcohol, Firearms, Tobacco) where prohibited. Must be `true` for the DIR to be submitted for vetting., certify_ip_ownership: bool # Certification of ownership of any logos/trademarks shown. Must be `true` for the DIR to be submitted for vetting., documents: [map{document_id!: str(uuid), document_type!: str, description: str}] # Additional supporting documents to attach. Append-only: existing documents are never removed or replaced, and an empty or omitted list is a no-op. Each `document_id` may appear at most once on a DIR.}\n@returns(200) {data: map{id: str(uuid), enterprise_id: str(uuid), display_name: str, reselling: bool, certify_brand_is_accurate: bool, certify_no_shaft_content: bool, certify_ip_ownership: bool, authorizer_name: str?, authorizer_email: str(email)?, logo_url: str(uri)?, call_reasons: [map], documents: [map]?, status: str, rejection_reasons: [map]?, rejected_at: str(date-time)?, created_at: str(date-time), updated_at: str(date-time), submitted_at: str(date-time)?, verified_at: str(date-time)?, expiring_at: str(date-time)?}} # DIR updated.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n@example_request {\"display_name\":\"Acme Plumbing & Wellness\",\"call_reasons\":[\"Appointment reminders\",\"Billing inquiries\",\"Lab results\"],\"logo_url\":\"https://acmeplumbing.example.com/logo-v2-256.bmp\"}\n\n@endpoint GET /dir/{dir_id}/comments\n@desc List comments on a DIR\n@required {dir_id: str(uuid) # The DIR id. Lowercase UUID.}\n@optional {page[number]: int=1: any # 1-based page number. Out-of-range values return an empty page with correct meta., page[size]: int=20 # Items per page. Maximum 250; values above are clamped to 250., comment_type: str # Restrict to comments of this category. Customer-visible categories only: internal-only comments are filtered out regardless of this filter.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Paginated list of comments.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint POST /dir/{dir_id}/comments\n@desc Post a comment on a DIR\n@required {dir_id: str(uuid) # The DIR id. Lowercase UUID., content: str # Comment body. 1–5000 characters.}\n@optional {parent_comment_id: str(uuid) # Optional parent comment id to thread this reply under.}\n@returns(201) {data: map{id: str(uuid), entity_type: str, content: str, visibility: str, author_role: str, author_name: str?, comment_type: str, created_at: str(date-time)}} # Comment created.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n@example_request {\"content\":\"Re-uploaded the certificate. New document_id: 89450109-ee35-411c-b5bb-14f1d806fca2.\"}\n\n@endpoint GET /dir/{dir_id}/infringement_claims\n@desc List infringement claims for a DIR\n@required {dir_id: str(uuid) # The DIR id. Lowercase UUID.}\n@optional {page[number]: int=1: any # 1-based page number. Out-of-range values return an empty page with correct meta., page[size]: int=20 # Items per page. Maximum 250; values above are clamped to 250.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Paginated list of claims for this DIR.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint PUT /dir/{dir_id}/infringement_update\n@desc Update a DIR to resolve an infringement concern\n@required {dir_id: str(uuid) # The DIR id. Lowercase UUID., certify_no_infringement: bool # Must be `true`., certify_brand_is_accurate: bool # Must be `true`., certify_no_shaft_content: bool # Must be `true`., certify_ip_ownership: bool # Must be `true`., infringement_resolution_notes: str # Explanation of how the infringement concern was addressed.}\n@optional {display_name: str, logo_url: str # Publicly accessible HTTPS URL (max 128 chars) to a 256x256 BMP logo (max 1 MB)., call_reasons: [str], documents: [map{document_id!: str(uuid), document_type!: str, description: str}] # Append-only supporting documents to attach while resolving the claim (e.g. authorization or licensing proof).}\n@returns(200) {data: map{id: str(uuid), enterprise_id: str(uuid), display_name: str, reselling: bool, certify_brand_is_accurate: bool, certify_no_shaft_content: bool, certify_ip_ownership: bool, authorizer_name: str?, authorizer_email: str(email)?, logo_url: str(uri)?, call_reasons: [map], documents: [map]?, status: str, rejection_reasons: [map]?, rejected_at: str(date-time)?, created_at: str(date-time), updated_at: str(date-time), submitted_at: str(date-time)?, verified_at: str(date-time)?, expiring_at: str(date-time)?}} # DIR updated and re-submitted for vetting.\n@errors {400: An error occurred. The response carries the standard Telnyx error envelope., 401: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope., 409: An error occurred. The response carries the standard Telnyx error envelope., 422: An error occurred. The response carries the standard Telnyx error envelope.}\n@example_request {\"certify_no_infringement\":true,\"certify_brand_is_accurate\":true,\"certify_no_shaft_content\":true,\"certify_ip_ownership\":true,\"infringement_resolution_notes\":\"Updated the display name to remove the disputed mark and re-uploaded the authorization.\"}\n\n@endpoint POST /dir/{dir_id}/loa\n@desc Render the Branded Calling LOA for a DIR\n@required {dir_id: str(uuid) # The DIR id., phone_numbers: [str] # Telephone numbers to authorize on the DIR, in `+E164` format (`+` followed by 10-15 digits). Max 15 per request.}\n@optional {agent: any # Optional. The third-party reseller / partner managing the enterprise's phone numbers. Omit when working directly with Telnyx; the LOA marks the Authorized Agent block as N/A., signature: any # Optional. When provided the rendered PDF embeds the signature image, printed name, and signed-at date. When absent the PDF is returned unsigned so the customer can sign externally and upload it via the Documents API.}\n@returns(200) The rendered LOA PDF.\n@errors {400: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint GET /dir/{dir_id}/phone_number_batches\n@desc List phone-number batches for a DIR\n@required {dir_id: str(uuid) # The DIR id. Lowercase UUID.}\n@optional {page[number]: int=1: any # 1-based page number. Out-of-range values return an empty page with correct meta., page[size]: int=20 # Items per page. Maximum 250; values above are clamped to 250., filter[status]: str # Restrict to batches whose aggregate status equals this value.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Paginated list of batches.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint GET /dir/{dir_id}/phone_number_batches/{batch_id}\n@desc Get a phone-number batch\n@required {dir_id: str(uuid) # The DIR id. Lowercase UUID., batch_id: str(uuid) # The batch id (lowercase UUID).}\n@returns(200) {data: map{batch_id: str(uuid), dir_id: str(uuid), dir_display_name: str, enterprise_id: str(uuid), status: str, total_count: int, submitted_at: str(date-time), documents: [map], phone_numbers: [map]}} # Batch.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint DELETE /dir/{dir_id}/phone_numbers\n@desc Remove phone numbers from a DIR\n@required {dir_id: str(uuid) # The DIR id. Lowercase UUID., phone_numbers: [str]}\n@returns(200) {data: [str], meta: map{errors: [map]}} # Bulk-delete response. Inspect both `deleted` and `errors`.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n@example_request {\"phone_numbers\":[\"+19493253498\"]}\n\n@endpoint GET /dir/{dir_id}/phone_numbers\n@desc List phone numbers attached to a DIR\n@required {dir_id: str(uuid) # The DIR id. Lowercase UUID.}\n@optional {page[number]: int=1: any # 1-based page number. Out-of-range values return an empty page with correct meta., page[size]: int=20 # Items per page. Maximum 250; values above are clamped to 250., status: str # Filter by phone-number status.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Paginated list of phone numbers.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint POST /dir/{dir_id}/phone_numbers\n@desc Add phone numbers to a DIR\n@required {dir_id: str(uuid) # The DIR id. Lowercase UUID., phone_numbers: [str] # 1–15 phone numbers in E.164 format. 10-digit US numbers are auto-prefixed with `1`., documents: [map{document_id!: str(uuid), document_type!: str, description: str}] # Supporting documents covering this batch. At least one entry with `document_type: letter_of_authorization` is required - the LOA authorises Telnyx to register these numbers under the DIR. Each `document_id` must come from the Telnyx Documents API. Additional document types (e.g. business registration) may be included alongside the LOA.}\n@returns(201) {data: [map]} # Bulk-add response. Inspect both `added` and `errors`.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n@example_request {\"phone_numbers\":[\"+19493253498\",\"+12134445566\"],\"documents\":[{\"document_id\":\"2a7e8337-e803-4057-a4ae-26c40eb0bc6c\",\"document_type\":\"letter_of_authorization\",\"description\":\"LOA authorising Telnyx to register these numbers under the DIR.\"}]}\n\n@endpoint GET /dir/{dir_id}/references\n@desc List a DIR's references\n@required {dir_id: str(uuid) # The DIR id. Lowercase UUID.}\n@returns(200) {data: [map]} # The DIR's references.\n@errors {404: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint POST /dir/{dir_id}/references\n@desc Submit a DIR's references\n@required {dir_id: str(uuid) # The DIR id. Lowercase UUID., business_references: [map{full_name!: str, job_title: str, organization: str, relationship_to_registrant: str, phone_e164!: str, email!: str(email), timezone!: str}] # Exactly two business references. Array order determines each one's slot: the first entry becomes slot 1 and the second becomes slot 2. Those slots are what you pass when updating a single reference later. Each should be a senior contact who can speak to your company's reputation and operations: a C-suite executive (CEO, CFO, CTO, COO), an owner or founder as reflected in your corporate records, or a senior manager, director, or executive at an organization you work with, such as a vendor, partner, or client., financial_reference: any # One financial reference who can confirm the company pays its bills: a licensed certified public accountant (CPA) the company uses, a contact at a bank or financial institution that has a relationship with the company, or a reasonable alternative banking or financial reference.}\n@returns(200) {data: [map]} # Resubmit accepted. Identical values were confirmed unchanged, or changed values replaced those references.\n@returns(201) {data: [map]} # The stored references.\n@errors {400: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope., 409: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint PATCH /dir/{dir_id}/references/{ref_type}/{slot}\n@desc Update a DIR reference\n@required {dir_id: str(uuid) # The DIR id. Lowercase UUID., ref_type: str(business/financial) # Reference type to address., slot: int # Reference slot, counting from 1. Business references are slots 1 and 2, matching the order they were sent in the `business_references` array; the financial reference is slot 1. Every reference returned by the submit and list endpoints carries its own `ref_type` and `slot`, so you do not need to derive them.}\n@optional {full_name: str # Full name of the reference contact., job_title: str # Job title of the reference contact., organization: str # Organization the reference contact belongs to., relationship_to_registrant: str # How the reference contact is related to the registering business., phone_e164: str # Reference phone number in E.164 format., email: str(email) # Reference contact email address., timezone: str # IANA timezone id for the reference.}\n@returns(200) {data: map{record_type: str, ref_type: str, slot: int, full_name: str, job_title: str?, organization: str?, relationship_to_registrant: str?, phone_e164: str, email: str(email)?, timezone: str}} # The updated reference.\n@errors {400: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint POST /dir/{dir_id}/submit\n@desc Submit a DIR for vetting\n@required {dir_id: str(uuid) # The DIR id. Lowercase UUID.}\n@returns(200) {data: map{id: str(uuid), enterprise_id: str(uuid), display_name: str, reselling: bool, certify_brand_is_accurate: bool, certify_no_shaft_content: bool, certify_ip_ownership: bool, authorizer_name: str?, authorizer_email: str(email)?, logo_url: str(uri)?, call_reasons: [map], documents: [map]?, status: str, rejection_reasons: [map]?, rejected_at: str(date-time)?, created_at: str(date-time), updated_at: str(date-time), submitted_at: str(date-time)?, verified_at: str(date-time)?, expiring_at: str(date-time)?}} # DIR submitted.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint GET /dir/{dir_id}/verify_email\n@desc Get email-ownership verification status\n@required {dir_id: str(uuid) # The DIR id. Lowercase UUID.}\n@returns(200) {data: map{record_type: str, email_verified: bool, status: str, expires_at: str(date-time)?, sends_remaining_today: int?}} # The current verification state.\n@errors {404: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint POST /dir/{dir_id}/verify_email\n@desc Send an email-ownership verification code\n@required {dir_id: str(uuid) # The DIR id. Lowercase UUID.}\n@returns(200) {data: map{record_type: str, email_verified: bool, status: str, expires_at: str(date-time)?, sends_remaining_today: int?}} # A code was emailed; the current verification state is returned.\n@errors {400: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope., 429: An error occurred. The response carries the standard Telnyx error envelope., 503: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint POST /dir/{dir_id}/verify_email/confirm\n@desc Confirm an email-ownership verification code\n@required {dir_id: str(uuid) # The DIR id. Lowercase UUID., code: str # The 6-digit code sent to the authorizer email.}\n@returns(200) {data: map{record_type: str, email_verified: bool, status: str, expires_at: str(date-time)?, sends_remaining_today: int?}} # The authorizer email is verified.\n@errors {400: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endgroup\n\n@group document_links\n@endpoint GET /document_links\n@desc List all document links\n@optional {filter: map # Consolidated filter parameter for document links (deepObject style). Originally: filter[linked_record_type], filter[linked_resource_id], page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {data: [any], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endgroup\n\n@group documents\n@endpoint GET /documents\n@desc List all documents\n@optional {filter: map # Consolidated filter parameter for documents (deepObject style). Originally: filter[filename][contains], filter[customer_reference][eq], filter[customer_reference][in][], filter[created_at][gt], filter[created_at][lt], sort: [str] # Consolidated sort parameter for documents (deepObject style). Originally: sort[], page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {data: [any], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint POST /documents\n@desc Upload a document\n@optional {url: str # If the file is already hosted publicly, you can provide a URL and have the documents service fetch it for you., file: str(byte) # Alternatively, instead of the URL you can provide the Base64 encoded contents of the file you are uploading., filename: str # The filename of the document., customer_reference: str # A customer reference string for customer look ups.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint DELETE /documents/{id}\n@desc Delete a document\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint GET /documents/{id}\n@desc Retrieve a document\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint PATCH /documents/{id}\n@desc Update a document\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint GET /documents/{id}/download\n@desc Download a document\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) Successful response\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint GET /documents/{id}/download_link\n@desc Generate a temporary download link for a document\n@required {id: str(uuid) # Uniquely identifies the document}\n@returns(200) {data: map{url: str(uri)}} # Successfully generated download link\n@errors {404: Resource not found, 422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endgroup\n\n@group dynamic_emergency_addresses\n@endpoint GET /dynamic_emergency_addresses\n@desc List dynamic emergency addresses\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[status], filter[country_code], page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: num(integer), total_results: num(integer), page_number: num(integer), page_size: num(integer)}} # Dynamic Emergency Address Responses\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint POST /dynamic_emergency_addresses\n@desc Create a dynamic emergency address.\n@required {house_number: str, street_name: str, locality: str, administrative_area: str, postal_code: str, country_code: str(US/CA/PR)}\n@optional {id: str, record_type: str # Identifies the type of the resource., sip_geolocation_id: str # Unique location reference string to be used in SIP INVITE from / p-asserted headers., status: str(pending/activated/rejected) # Status of dynamic emergency address, house_suffix: str, street_pre_directional: str, street_suffix: str, street_post_directional: str, extended_address: str, created_at: str # ISO 8601 formatted date of when the resource was created, updated_at: str # ISO 8601 formatted date of when the resource was last updated}\n@returns(201) {data: map{id: str, record_type: str, sip_geolocation_id: str, status: str, house_number: str, house_suffix: str, street_pre_directional: str, street_name: str, street_suffix: str, street_post_directional: str, extended_address: str, locality: str, administrative_area: str, postal_code: str, country_code: str, created_at: str, updated_at: str}} # Dynamic Emergency Address Response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint DELETE /dynamic_emergency_addresses/{id}\n@desc Delete a dynamic emergency address\n@required {id: str(uuid) # Dynamic Emergency Address id}\n@returns(200) {data: map{id: str, record_type: str, sip_geolocation_id: str, status: str, house_number: str, house_suffix: str, street_pre_directional: str, street_name: str, street_suffix: str, street_post_directional: str, extended_address: str, locality: str, administrative_area: str, postal_code: str, country_code: str, created_at: str, updated_at: str}} # Dynamic Emergency Address Response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /dynamic_emergency_addresses/{id}\n@desc Get a dynamic emergency address\n@required {id: str(uuid) # Dynamic Emergency Address id}\n@returns(200) {data: map{id: str, record_type: str, sip_geolocation_id: str, status: str, house_number: str, house_suffix: str, street_pre_directional: str, street_name: str, street_suffix: str, street_post_directional: str, extended_address: str, locality: str, administrative_area: str, postal_code: str, country_code: str, created_at: str, updated_at: str}} # Dynamic Emergency Address Response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group dynamic_emergency_endpoints\n@endpoint GET /dynamic_emergency_endpoints\n@desc List dynamic emergency endpoints\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[status], filter[country_code]}\n@returns(200) {data: [map], meta: map{total_pages: num(integer), total_results: num(integer), page_number: num(integer), page_size: num(integer)}} # Dynamic Emergency Endpoints Responses\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint POST /dynamic_emergency_endpoints\n@desc Create a dynamic emergency endpoint.\n@required {dynamic_emergency_address_id: str # An id of a currently active dynamic emergency location., callback_number: str, caller_name: str}\n@optional {id: str, record_type: str # Identifies the type of the resource., status: str(pending/activated/rejected) # Status of dynamic emergency address, sip_from_id: str, created_at: str # ISO 8601 formatted date of when the resource was created, updated_at: str # ISO 8601 formatted date of when the resource was last updated}\n@returns(201) {data: map{id: str, record_type: str, dynamic_emergency_address_id: str, status: str, sip_from_id: str, callback_number: str, caller_name: str, created_at: str, updated_at: str}} # Dynamic Emergency Endpoint Response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint DELETE /dynamic_emergency_endpoints/{id}\n@desc Delete a dynamic emergency endpoint\n@required {id: str(uuid) # Dynamic Emergency Endpoint id}\n@returns(200) {data: map{id: str, record_type: str, dynamic_emergency_address_id: str, status: str, sip_from_id: str, callback_number: str, caller_name: str, created_at: str, updated_at: str}} # Dynamic Emergency Endpoint Response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /dynamic_emergency_endpoints/{id}\n@desc Get a dynamic emergency endpoint\n@required {id: str(uuid) # Dynamic Emergency Endpoint id}\n@returns(200) {data: map{id: str, record_type: str, dynamic_emergency_address_id: str, status: str, sip_from_id: str, callback_number: str, caller_name: str, created_at: str, updated_at: str}} # Dynamic Emergency Endpoint Response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group email_blocks\n@endpoint GET /email_blocks\n@desc List suppressions\n@optional {page[number]: int=1: any # Offset page number (≥1, default 1)., page[size]: int=25 # Page size (1–100, default 25)., page[after]: str # Opaque cursor (`Base.url_encode64` of `{\"created_at\",\"id\"}`). Cursor mode; mutually exclusive with `page[number]` and `page[before]`., page[before]: str # Opaque cursor (see `page[after]`). Mutually exclusive with `page[after]` and `page[number]`., sort: str(created_at/-created_at)=-created_at # Sort field. Leading `-` = desc; only `created_at` is sortable. Default `-created_at`. `--` is an error., filter[reason]: str # Exact-match filter on reason., filter[domain_id]: str(uuid) # Exact-match filter on domain_id (UUID)., filter[created_after]: str(date-time) # `created_at > value` (ISO 8601)., filter[created_before]: str(date-time) # `created_at < value` (ISO 8601).}\n@returns(200) List of suppressions.\n@errors {400: Query-param validation error (`source.pointer /`)., 401: Missing or invalid gateway auth., 406: Framework-rendered error (e.g. 406 Not Acceptable, 405 Method Not Allowed, 415 Unsupported Media Type). HTTP status matches the error and the body `code` carries that same status (e.g. `\"406\"`, not a hardcoded `\"500\"`). The explicit `500.json` clause still emits `code: \"500\"` for genuine 500s.}\n\n@endpoint POST /email_blocks\n@desc Create a manual suppression\n@required {to: str # Recipient address (normalized: trim + lower-case).}\n@optional {from: str # Sender address (normalized). `null` ⇒ account/domain scope., domain_id: str(uuid) # `null` ⇒ account scope., expires_at: str(date-time)}\n@returns(200) {data: map{id: str(uuid), record_type: str, domain_id: str(uuid)?, group_id: str(uuid)?, from: str?, to: str, reason: str, source: str, scope: str, status: str, created_at: str(date-time), updated_at: str(date-time), expires_at: str(date-time)?}} # Idempotent — matching suppression already existed.\n@returns(201) {data: map{id: str(uuid), record_type: str, domain_id: str(uuid)?, group_id: str(uuid)?, from: str?, to: str, reason: str, source: str, scope: str, status: str, created_at: str(date-time), updated_at: str(date-time), expires_at: str(date-time)?}} # Created.\n@errors {401: Missing or invalid gateway auth., 406: Framework-rendered error (e.g. 406 Not Acceptable, 405 Method Not Allowed, 415 Unsupported Media Type). HTTP status matches the error and the body `code` carries that same status (e.g. `\"406\"`, not a hardcoded `\"500\"`). The explicit `500.json` clause still emits `code: \"500\"` for genuine 500s., 422: Validation error (changeset or internal `Params`). One error object per field, `source.pointer /data/attributes/`.}\n@example_request {\"to\":\"spammer@bad.tld\",\"expires_at\":\"2026-12-31T23:59:59Z\"}\n\n@endpoint GET /email_blocks/export\n@desc Export suppressions as CSV\n@optional {sort: str(created_at/-created_at)=-created_at # Sort field. Leading `-` = desc; only `created_at` is sortable. Default `-created_at`. `--` is an error., page[number]: int=1 # Offset page number (≥1, default 1)., page[size]: int=25 # Page size (1–100, default 25)., filter[reason]: str # Exact-match filter on reason., filter[domain_id]: str(uuid) # Exact-match filter on domain_id (UUID)., filter[created_after]: str(date-time) # `created_at > value` (ISO 8601)., filter[created_before]: str(date-time) # `created_at < value` (ISO 8601).}\n@returns(200) CSV stream.\n@errors {400: Query-param validation error (`source.pointer /`)., 401: Missing or invalid gateway auth., 406: Framework-rendered error (e.g. 406 Not Acceptable, 405 Method Not Allowed, 415 Unsupported Media Type). HTTP status matches the error and the body `code` carries that same status (e.g. `\"406\"`, not a hardcoded `\"500\"`). The explicit `500.json` clause still emits `code: \"500\"` for genuine 500s.}\n\n@endpoint POST /email_blocks/import\n@desc Create an async CSV import job\n@returns(202) {data: map{id: str(uuid), record_type: str, status: str, total: int, provider: str, created_at: str(date-time), updated_at: str(date-time), completed_at: str(date-time), processed_rows: int, created_count: int, existing_count: int, skipped_count: int, error_count: int, errors: map, failure_reason: str}} # Import job accepted (status `pending`).\n@errors {400: Query-param validation error (`source.pointer /`)., 401: Missing or invalid gateway auth., 406: Framework-rendered error (e.g. 406 Not Acceptable, 405 Method Not Allowed, 415 Unsupported Media Type). HTTP status matches the error and the body `code` carries that same status (e.g. `\"406\"`, not a hardcoded `\"500\"`). The explicit `500.json` clause still emits `code: \"500\"` for genuine 500s., 413: Two distinct 413 paths. Content-level cap (decoded CSV > 25 MiB or > 250 000 rows) returns `10015` with `source.pointer /file`. The multipart parser raises `RequestTooLargeError` when the encoded body exceeds 26 MiB — that's a framework error rendered with body `code: \"413\"` (matches the HTTP status)., 422: Validation error (changeset or internal `Params`). One error object per field, `source.pointer /data/attributes/`., 500: Import-create fallback (`code 10019`, \"Failed to create import\").}\n\n@endpoint GET /email_blocks/import/{id}\n@desc Poll an import job\n@returns(200) {data: map{id: str(uuid), record_type: str, status: str, total: int, provider: str, created_at: str(date-time), updated_at: str(date-time), completed_at: str(date-time), processed_rows: int, created_count: int, existing_count: int, skipped_count: int, error_count: int, errors: map, failure_reason: str}} # The import record.\n@errors {401: Missing or invalid gateway auth., 404: Resource not found (cross-account lookups and malformed UUIDs also return 404 — no leak)., 406: Framework-rendered error (e.g. 406 Not Acceptable, 405 Method Not Allowed, 415 Unsupported Media Type). HTTP status matches the error and the body `code` carries that same status (e.g. `\"406\"`, not a hardcoded `\"500\"`). The explicit `500.json` clause still emits `code: \"500\"` for genuine 500s.}\n\n@endpoint DELETE /email_blocks/{id}\n@desc Soft-delete a suppression\n@returns(200) {data: map{id: str(uuid), record_type: str, domain_id: str(uuid)?, group_id: str(uuid)?, from: str?, to: str, reason: str, source: str, scope: str, status: str, created_at: str(date-time), updated_at: str(date-time), expires_at: str(date-time)?}} # The post-deletion record (status `removed`).\n@errors {401: Missing or invalid gateway auth., 404: Resource not found (cross-account lookups and malformed UUIDs also return 404 — no leak)., 406: Framework-rendered error (e.g. 406 Not Acceptable, 405 Method Not Allowed, 415 Unsupported Media Type). HTTP status matches the error and the body `code` carries that same status (e.g. `\"406\"`, not a hardcoded `\"500\"`). The explicit `500.json` clause still emits `code: \"500\"` for genuine 500s., 422: Validation error (changeset or internal `Params`). One error object per field, `source.pointer /data/attributes/`.}\n\n@endpoint GET /email_blocks/{id}\n@desc Retrieve a suppression\n@returns(200) {data: map{id: str(uuid), record_type: str, domain_id: str(uuid)?, group_id: str(uuid)?, from: str?, to: str, reason: str, source: str, scope: str, status: str, created_at: str(date-time), updated_at: str(date-time), expires_at: str(date-time)?}} # The suppression.\n@errors {401: Missing or invalid gateway auth., 404: Resource not found (cross-account lookups and malformed UUIDs also return 404 — no leak)., 406: Framework-rendered error (e.g. 406 Not Acceptable, 405 Method Not Allowed, 415 Unsupported Media Type). HTTP status matches the error and the body `code` carries that same status (e.g. `\"406\"`, not a hardcoded `\"500\"`). The explicit `500.json` clause still emits `code: \"500\"` for genuine 500s.}\n\n@endpoint GET /email_blocks/{id}/events\n@desc List audit events for a suppression\n@optional {page[number]: int=1: any # Offset page number (≥1, default 1)., page[size]: int=50 # Page size (default 50, max 100).}\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_pages: int, total_results: int}} # Audit events (newest-first).\n@errors {400: Query-param validation error (`source.pointer /`)., 401: Missing or invalid gateway auth., 404: Resource not found (cross-account lookups and malformed UUIDs also return 404 — no leak)., 406: Framework-rendered error (e.g. 406 Not Acceptable, 405 Method Not Allowed, 415 Unsupported Media Type). HTTP status matches the error and the body `code` carries that same status (e.g. `\"406\"`, not a hardcoded `\"500\"`). The explicit `500.json` clause still emits `code: \"500\"` for genuine 500s.}\n\n@endgroup\n\n@group email_domains\n@endpoint GET /email_domains\n@desc List email domains\n@optional {page[number]: int=1: any # Page number to return (offset pagination), page[size]: int=25 # Number of records per page, page[after]: str # Cursor for records after the provided value (cursor pagination), page[before]: str # Cursor for records before the provided value (cursor pagination), sort: str(created_at/-created_at/domain/-domain) # Field to sort by. Prefix with `-` for descending order., filter[status]: str # Filter domains by verification status: pending, verifying, verified, failed, degraded, or suspended., filter[domain]: str # Partial match on domain name (case-insensitive), filter[profile_id]: str(uuid) # Filter by profile UUID, filter[type]: str # Filter domains by type: custom, shared, or shared_inbound., filter[usable_for_sending]: bool # Filter domains by whether they can currently be used to send email., filter[usable_for_inbound]: bool # Filter domains by whether they can currently receive inbound email.}\n@returns(200) {data: [map], meta: any} # A paginated list of email domains\n@errors {400: Validation failed, 500: Internal server error}\n\n@endpoint POST /email_domains\n@desc Create an email domain\n@required {domain: str}\n@optional {inbound_enabled: bool=false # Enable inbound routing for this domain, dmarc_policy: map # DMARC policy. Omit/null for the advisory default (v=DMARC1; p=none; rua=mailto:dmarc@telnyx.com)., tracking: map{open_tracking: bool, click_tracking: bool, unsubscribe_tracking: bool}}\n@returns(201) {data: map{id: str(uuid), record_type: str, domain: str, type: str, status: str, usable_for_sending: bool, usable_for_inbound: bool, verification: map{ownership: str, spf: str, dkim: str, dmarc: str, mx: str}, dns_records: [map], dkim: map{selector: str?, algorithm: str?, key_length: int?, active: bool, rotated_at: str(date-time)?}, inbound: map{enabled: bool, catch_all: bool, mx_required: bool}, dmarc_policy: map?, tracking: map{open_tracking: bool, click_tracking: bool, unsubscribe_tracking: bool}, created_at: str(date-time), updated_at: str(date-time), verified_at: str(date-time)?, reputation: map{band: str, breakdown: map, computed_at: str(date-time)?}}} # Email domain created\n@errors {422: Validation failed, 500: Internal server error}\n@example_request {\"domain\":\"example.com\",\"inbound_enabled\":true,\"tracking\":{\"open_tracking\":true,\"click_tracking\":true,\"unsubscribe_tracking\":false}}\n\n@endpoint GET /email_domains/{domain_id}/dns_records\n@desc List DNS records for an email domain\n@required {domain_id: str(uuid) # Email domain UUID}\n@returns(200) {data: [map]} # DNS records for the email domain\n@errors {404: Resource not found, 500: Internal server error}\n\n@endpoint POST /email_domains/{domain_id}/rotate_dkim\n@desc Rotate the DKIM key for an email domain\n@required {domain_id: str(uuid) # Email domain UUID}\n@returns(201) {data: map{record_type: str, domain_id: str(uuid), domain: str, dkim: map{id: str(uuid), selector: str, algorithm: str, key_length: int, version: int, status: str, activated_at: str(date-time)?}, previous_dkim_key: map?{id: str(uuid), selector: str, version: int, status: str}, old_selector_retained: bool, dns_records: [map]}} # DKIM key rotated\n@errors {403: Forbidden — shared email domains are managed by Telnyx and cannot have their DKIM keys rotated by this account., 404: Resource not found, 409: DKIM rotation conflicted with a concurrent operation on this domain. Safe to retry., 422: Validation failed, 500: Internal server error}\n\n@endpoint POST /email_domains/{domain_id}/verify\n@desc Verify DNS records for an email domain\n@required {domain_id: str(uuid) # Email domain UUID}\n@returns(200) {data: map{id: str(uuid), record_type: str, domain: str, type: str, status: str, usable_for_sending: bool, usable_for_inbound: bool, verification: map{ownership: str, spf: str, dkim: str, dmarc: str, mx: str}, dns_records: [map], dkim: map{selector: str?, algorithm: str?, key_length: int?, active: bool, rotated_at: str(date-time)?}, inbound: map{enabled: bool, catch_all: bool, mx_required: bool}, dmarc_policy: map?, tracking: map{open_tracking: bool, click_tracking: bool, unsubscribe_tracking: bool}, created_at: str(date-time), updated_at: str(date-time), verified_at: str(date-time)?, reputation: map{band: str, breakdown: map, computed_at: str(date-time)?}}} # Updated email domain with latest DNS verification results\n@errors {403: Forbidden — shared domains are read-only for non-owner accounts (error code 10008)., 404: Resource not found, 422: Validation failed, 500: Internal server error}\n\n@endpoint GET /email_domains/{domain_id}/webhooks\n@desc List webhooks for an email domain\n@required {domain_id: str(uuid) # Email domain UUID}\n@optional {page[number]: int=1: any # Page number to return (offset pagination), page[size]: int=25 # Number of records per page, sort: str(created_at/-created_at) # Field to sort by. Prefix with `-` for descending order.}\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_pages: int, total_results: int}} # A paginated list of email webhooks\n@errors {404: Resource not found, 500: Internal server error}\n\n@endpoint POST /email_domains/{domain_id}/webhooks\n@desc Create a webhook for an email domain\n@required {domain_id: str(uuid) # Email domain UUID, url: str(uri) # HTTPS endpoint to deliver subscribed events to., events: [str] # At least one event type is required.}\n@returns(201) {data: map{id: str(uuid), record_type: str, url: str(uri), events: [str], domain_id: str(uuid), created_at: str(date-time), updated_at: str(date-time)}} # Email webhook created\n@errors {404: Resource not found, 422: Validation failed, 500: Internal server error}\n@example_request {\"url\":\"https://example.com/webhooks/email\",\"events\":[\"email.sent\",\"email.delivered\",\"email.bounced\"]}\n\n@endpoint DELETE /email_domains/{domain_id}/webhooks/{id}\n@desc Delete a webhook\n@required {domain_id: str(uuid) # Email domain UUID, id: str(uuid) # Email webhook UUID}\n@returns(200) {data: map{id: str(uuid), record_type: str, url: str(uri), events: [str], domain_id: str(uuid), created_at: str(date-time), updated_at: str(date-time)}} # Email webhook deleted\n@errors {404: Resource not found, 500: Internal server error}\n\n@endpoint GET /email_domains/{domain_id}/webhooks/{id}\n@desc Retrieve a webhook\n@required {domain_id: str(uuid) # Email domain UUID, id: str(uuid) # Email webhook UUID}\n@returns(200) {data: map{id: str(uuid), record_type: str, url: str(uri), events: [str], domain_id: str(uuid), created_at: str(date-time), updated_at: str(date-time)}} # Email webhook details\n@errors {404: Resource not found, 500: Internal server error}\n\n@endpoint PATCH /email_domains/{domain_id}/webhooks/{id}\n@desc Update a webhook\n@required {domain_id: str(uuid) # Email domain UUID, id: str(uuid) # Email webhook UUID}\n@optional {url: str(uri), events: [str]}\n@returns(200) {data: map{id: str(uuid), record_type: str, url: str(uri), events: [str], domain_id: str(uuid), created_at: str(date-time), updated_at: str(date-time)}} # Email webhook updated\n@errors {404: Resource not found, 422: Validation failed, 500: Internal server error}\n@example_request {\"events\":[\"email.sent\",\"email.delivered\",\"email.opened\"]}\n\n@endpoint DELETE /email_domains/{id}\n@desc Delete an email domain\n@required {id: str(uuid) # Email domain UUID}\n@optional {force: bool=false # Required as true when deleting verified domains}\n@returns(200) {data: map{id: str(uuid), record_type: str, domain: str, type: str, status: str, usable_for_sending: bool, usable_for_inbound: bool, verification: map{ownership: str, spf: str, dkim: str, dmarc: str, mx: str}, dns_records: [map], dkim: map{selector: str?, algorithm: str?, key_length: int?, active: bool, rotated_at: str(date-time)?}, inbound: map{enabled: bool, catch_all: bool, mx_required: bool}, dmarc_policy: map?, tracking: map{open_tracking: bool, click_tracking: bool, unsubscribe_tracking: bool}, created_at: str(date-time), updated_at: str(date-time), verified_at: str(date-time)?, reputation: map{band: str, breakdown: map, computed_at: str(date-time)?}}} # Email domain deleted\n@errors {403: Forbidden — shared domains are read-only for non-owner accounts (error code 10008)., 404: Resource not found, 422: Validation failed, 500: Internal server error}\n\n@endpoint GET /email_domains/{id}\n@desc Retrieve an email domain\n@required {id: str(uuid) # Email domain UUID}\n@returns(200) {data: map{id: str(uuid), record_type: str, domain: str, type: str, status: str, usable_for_sending: bool, usable_for_inbound: bool, verification: map{ownership: str, spf: str, dkim: str, dmarc: str, mx: str}, dns_records: [map], dkim: map{selector: str?, algorithm: str?, key_length: int?, active: bool, rotated_at: str(date-time)?}, inbound: map{enabled: bool, catch_all: bool, mx_required: bool}, dmarc_policy: map?, tracking: map{open_tracking: bool, click_tracking: bool, unsubscribe_tracking: bool}, created_at: str(date-time), updated_at: str(date-time), verified_at: str(date-time)?, reputation: map{band: str, breakdown: map, computed_at: str(date-time)?}}} # Email domain details\n@errors {404: Resource not found, 500: Internal server error}\n\n@endpoint PATCH /email_domains/{id}\n@desc Update an email domain\n@required {id: str(uuid) # Email domain UUID}\n@optional {inbound_enabled: bool # Enable or disable inbound routing for this domain, dmarc_policy: map # Update the DMARC policy. The recommended _dmarc TXT record is rebuilt and its verification reset to pending., tracking: map{open_tracking: bool, click_tracking: bool, unsubscribe_tracking: bool}}\n@returns(200) {data: map{id: str(uuid), record_type: str, domain: str, type: str, status: str, usable_for_sending: bool, usable_for_inbound: bool, verification: map{ownership: str, spf: str, dkim: str, dmarc: str, mx: str}, dns_records: [map], dkim: map{selector: str?, algorithm: str?, key_length: int?, active: bool, rotated_at: str(date-time)?}, inbound: map{enabled: bool, catch_all: bool, mx_required: bool}, dmarc_policy: map?, tracking: map{open_tracking: bool, click_tracking: bool, unsubscribe_tracking: bool}, created_at: str(date-time), updated_at: str(date-time), verified_at: str(date-time)?, reputation: map{band: str, breakdown: map, computed_at: str(date-time)?}}} # Email domain updated\n@errors {403: Forbidden — shared domains are read-only for non-owner accounts (error code 10008)., 404: Resource not found, 422: Validation failed, 500: Internal server error}\n@example_request {\"inbound_enabled\":true,\"tracking\":{\"open_tracking\":false}}\n\n@endpoint GET /email_domains/{id}/health\n@desc Get domain health summary\n@required {id: str(uuid) # Email domain UUID}\n@returns(200) {data: map{id: str(uuid), record_type: str, status: str, usable_for_sending: bool, usable_for_inbound: bool, verification: map{ownership: str, spf: str, dkim: str, dmarc: str, mx: str}, checked_at: str(date-time)}} # Domain health summary\n@errors {404: Resource not found, 500: Internal server error}\n\n@endgroup\n\n@group email_events\n@endpoint GET /email_events\n@desc List account email events\n@optional {page_size: int=25 # Number of results to return. Defaults to 25; maximum is 100. Invalid values are clamped to the valid range., page[cursor]: str # Opaque URL-safe Base64 cursor returned by a previous event list response. The legacy `page[after]` and flat `page_cursor` forms are also accepted., event_type: any # Comma-separated list of event types to include. Also accepts repeated query parameters (e.g. event_type=delivered&event_type=bounced). Unknown values return no matches.  Dual-name compatibility: values are accepted bare or `email.`-prefixed. A legacy value keeps matching the rows it matched pre-rename — no widening: `failed` also matches the rows that now store the canonical names of the outcomes it covered (`gw_reject`, `injection_timeout`, `expired`); `bounced` matches stored `bounced` rows only (recipient-scoped Expirations stored `failed` pre-rename and never matched `bounced`, so `expired` is deliberately not a `bounced` expansion). A canonical value matches its own rows plus legacy rows whose recorded payload evidence proves that outcome (`expired` also surfaces legacy `bounced` rows with `bounce_category: transient`). The additive `canonical_event_type` field in each response row names the canonical outcome., email_id: str(uuid) # Filter events for a specific email message UUID. Invalid UUID values are silently ignored (no filter applied)., from: str(date-time) # Inclusive ISO 8601 start timestamp. Defaults to 30 days ago when omitted., to: str(date-time) # Inclusive ISO 8601 end timestamp. When `from` is provided without `to`, defaults to `from + 30 days`.}\n@returns(200) {data: [map], meta: map{page_size: int, time_range: map{from: str(date-time)?, to: str(date-time)?}, page_cursor: str}} # Paginated list of account email events.\n@errors {401: Not authorized (10006).}\n\n@endpoint GET /email_events/stats\n@desc Get email event statistics\n@optional {from: str(date-time) # Inclusive ISO 8601 start timestamp. Defaults to 30 days ago when omitted., to: str(date-time) # Inclusive ISO 8601 end timestamp. When `from` is provided without `to`, defaults to `from + 30 days`.}\n@returns(200) {data: map{record_type: str, counts: map{queued: int, sent: int, delivered: int, deferred: int, bounced: int, opened: int, clicked: int, complained: int, unsubscribed: int, failed: int}, rates: map{delivery_rate: num(float), bounce_rate: num(float), deferred_rate: num(float), open_rate: num(float), click_rate: num(float), complaint_rate: num(float)}, time_range: map{from: str(date-time)?, to: str(date-time)?}}} # Email event statistics.\n@errors {401: Not authorized (10006).}\n\n@endgroup\n\n@group email_inboxes\n@endpoint GET /email_inboxes\n@desc List email inboxes\n@optional {page_size: int=20 # Number of results to return. Defaults to 20; maximum is 250., page_cursor: str # Opaque cursor returned by the previous inbox page.}\n@returns(200) {data: [map], meta: map{page_size: int, page_cursor: str}} # Paginated email inboxes.\n@errors {401: Not authorized (10006)., 422: Pagination validation failed (10015)., 503: Service unavailable (10016), including an unavailable upstream dependency or unavailable Edge idempotency protection for a keyed request.}\n\n@endpoint POST /email_inboxes\n@desc Create an email inbox\n@optional {username: str # Inbox local part. Trimmed and lowercased before validation; the normalized value must be 1-64 characters, start and end with a letter or digit, and contain only letters, digits, dots, hyphens, and underscores. Generated when omitted., domain_id: str(uuid) # Account-owned, inbound-enabled domain UUID. The account's shared inbound subdomain is allocated when omitted.}\n@returns(201) {data: map{id: str(uuid), record_type: str, address: str(email), status: str, domain_id: str(uuid), domain: str, settings: map, created_at: str(date-time), updated_at: str(date-time)}} # Email inbox created.\n@errors {401: Not authorized (10006)., 422: Inbox validation failed (10015)., 503: Service unavailable (10016), including an unavailable upstream dependency or unavailable Edge idempotency protection for a keyed request.}\n@example_request {}\n\n@endpoint DELETE /email_inboxes/{id}\n@desc Delete an email inbox\n@required {id: str(uuid) # Email inbox UUID.}\n@returns(204) Email inbox deleted. The response has no body.\n@errors {401: Not authorized (10006)., 404: Email inbox not found, already deleted, or owned by another account (10001)., 503: Service unavailable (10016), including an unavailable upstream dependency or unavailable Edge idempotency protection for a keyed request.}\n\n@endpoint GET /email_inboxes/{id}\n@desc Get an email inbox\n@required {id: str(uuid) # Email inbox UUID.}\n@returns(200) {data: map{id: str(uuid), record_type: str, address: str(email), status: str, domain_id: str(uuid), domain: str, settings: map, created_at: str(date-time), updated_at: str(date-time)}} # Email inbox details.\n@errors {401: Not authorized (10006)., 404: Email inbox not found (10001)., 503: Service unavailable (10016), including an unavailable upstream dependency or unavailable Edge idempotency protection for a keyed request.}\n\n@endpoint GET /email_inboxes/{inbox_id}/drafts\n@desc List drafts in an inbox\n@required {inbox_id: str(uuid) # Email inbox UUID.}\n@optional {filter[status]: str(draft/sending/sent): any # Restrict results to drafts in this state., page[size]: int=25 # Number of results to return. Defaults to 25; maximum is 100., page[after]: str # Opaque cursor returned by the previous page.}\n@returns(200) {data: [map], meta: map{page_size: int, page_cursor: str}} # Paginated drafts.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 503: Drafts or the email domain service are temporarily unavailable (10016).}\n\n@endpoint POST /email_inboxes/{inbox_id}/drafts\n@desc Create a draft\n@required {inbox_id: str(uuid) # Email inbox UUID.}\n@optional {from_email: str, from_name: str, to: [any], cc: [any], bcc: [any], reply_to: str, subject: str, text_body: str, html_body: str, text: str # Alias for `text_body`, matching the send endpoint., html: str # Alias for `html_body`, matching the send endpoint., headers: map, attachments: [map], labels: [str], tags: [str], metadata: map}\n@returns(201) {data: map{record_type: str, id: str(uuid), inbox_id: str(uuid), status: str, from: str?, from_name: str?, to: [map], cc: [map], bcc: [map], reply_to: str?, subject: str?, text_body: str?, html_body: str?, headers: map, attachments: [map], labels: [str], tags: [str], metadata: map, reply_to_message_id: str(uuid)?, thread_id: str(uuid)?, sent_message_id: str(uuid)?, sent_at: str(date-time)?, created_at: str(date-time), updated_at: str(date-time)}} # The created draft.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 422: Validation Failed (10015) or changeset validation error., 503: Drafts or the email domain service are temporarily unavailable (10016).}\n@example_request {\"to\":[{\"email\":\"recipient@example.com\",\"name\":\"Recipient\"}],\"subject\":\"Quarterly update\",\"text_body\":\"Here is the update.\",\"labels\":[\"important\"]}\n\n@endpoint DELETE /email_inboxes/{inbox_id}/drafts/{draft_id}\n@desc Delete a draft\n@required {inbox_id: str(uuid) # Email inbox UUID., draft_id: str(uuid) # Email draft UUID.}\n@returns(204) The draft was deleted.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 422: The draft is being sent or has already been sent and is retained for audit., 503: Drafts or the email domain service are temporarily unavailable (10016).}\n\n@endpoint GET /email_inboxes/{inbox_id}/drafts/{draft_id}\n@desc Retrieve a draft\n@required {inbox_id: str(uuid) # Email inbox UUID., draft_id: str(uuid) # Email draft UUID.}\n@returns(200) {data: map{record_type: str, id: str(uuid), inbox_id: str(uuid), status: str, from: str?, from_name: str?, to: [map], cc: [map], bcc: [map], reply_to: str?, subject: str?, text_body: str?, html_body: str?, headers: map, attachments: [map], labels: [str], tags: [str], metadata: map, reply_to_message_id: str(uuid)?, thread_id: str(uuid)?, sent_message_id: str(uuid)?, sent_at: str(date-time)?, created_at: str(date-time), updated_at: str(date-time)}} # The requested draft.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 503: Drafts or the email domain service are temporarily unavailable (10016).}\n\n@endpoint PATCH /email_inboxes/{inbox_id}/drafts/{draft_id}\n@desc Update a draft (alias)\n@required {inbox_id: str(uuid) # Email inbox UUID., draft_id: str(uuid) # Email draft UUID.}\n@optional {from_email: str, from_name: str, to: [any], cc: [any], bcc: [any], reply_to: str, subject: str, text_body: str, html_body: str, text: str # Alias for `text_body`, matching the send endpoint., html: str # Alias for `html_body`, matching the send endpoint., headers: map, attachments: [map], labels: [str], tags: [str], metadata: map}\n@returns(200) {data: map{record_type: str, id: str(uuid), inbox_id: str(uuid), status: str, from: str?, from_name: str?, to: [map], cc: [map], bcc: [map], reply_to: str?, subject: str?, text_body: str?, html_body: str?, headers: map, attachments: [map], labels: [str], tags: [str], metadata: map, reply_to_message_id: str(uuid)?, thread_id: str(uuid)?, sent_message_id: str(uuid)?, sent_at: str(date-time)?, created_at: str(date-time), updated_at: str(date-time)}} # The updated draft.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 422: Validation Failed (10015) or changeset validation error., 503: Drafts or the email domain service are temporarily unavailable (10016).}\n@example_request {\"subject\":\"Quarterly update (revised)\",\"text_body\":\"Updated body.\"}\n\n@endpoint PUT /email_inboxes/{inbox_id}/drafts/{draft_id}\n@desc Update a draft\n@required {inbox_id: str(uuid) # Email inbox UUID., draft_id: str(uuid) # Email draft UUID.}\n@optional {from_email: str, from_name: str, to: [any], cc: [any], bcc: [any], reply_to: str, subject: str, text_body: str, html_body: str, text: str # Alias for `text_body`, matching the send endpoint., html: str # Alias for `html_body`, matching the send endpoint., headers: map, attachments: [map], labels: [str], tags: [str], metadata: map}\n@returns(200) {data: map{record_type: str, id: str(uuid), inbox_id: str(uuid), status: str, from: str?, from_name: str?, to: [map], cc: [map], bcc: [map], reply_to: str?, subject: str?, text_body: str?, html_body: str?, headers: map, attachments: [map], labels: [str], tags: [str], metadata: map, reply_to_message_id: str(uuid)?, thread_id: str(uuid)?, sent_message_id: str(uuid)?, sent_at: str(date-time)?, created_at: str(date-time), updated_at: str(date-time)}} # The updated draft.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 422: Validation Failed (10015) or changeset validation error., 503: Drafts or the email domain service are temporarily unavailable (10016).}\n@example_request {\"subject\":\"Quarterly update (revised)\",\"text_body\":\"Updated body.\"}\n\n@endpoint POST /email_inboxes/{inbox_id}/drafts/{draft_id}/send\n@desc Send a draft\n@required {inbox_id: str(uuid) # Email inbox UUID., draft_id: str(uuid) # Email draft UUID.}\n@returns(202) {data: map{record_type: str, id: str(uuid), status: str, from: map{email: str, name: str}, to: [map], cc: [map], bcc: [map], reply_to: str?, subject: str, template_id: str(uuid)?, template_variables: map, tags: [str], metadata: map, attachments: [map], events: [map], created_at: str(date-time), scheduled_at: str(date-time), inline_css: bool, sandbox: bool, recipient_statuses: map, suppressed: [map]}, suppressed: [map]} # The draft was accepted for delivery. Returns the created email message.\n@errors {400: The draft is missing fields required to send (sender, subject, or recipients)., 401: Not authorized (10006)., 403: The sender domain is not permitted to send., 404: Resource not found (10001)., 422: The draft has already been sent, or failed send-time validation., 429: Send rejected before message creation because the account daily recipient quota was exhausted (10011), the sender-domain graduation ceiling was exceeded (domain_graduation_limit_exceeded), or domain reputation is poor (reputation_suspended)., 503: Drafts or the email domain service are temporarily unavailable (10016).}\n\n@endpoint DELETE /email_inboxes/{inbox_id}/filters\n@desc Remove sender filter entries from an inbox\n@required {type: str(allowlist/blocklist) # The list to change., entries: [str]}\n@returns(200) {data: map{record_type: str, allowlist: [str], blocklist: [str]}} # The inbox's current sender allowlist and blocklist.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 422: Validation Failed (10015) or changeset validation error., 503: Service unavailable (10016), including an unavailable upstream dependency or unavailable Edge idempotency protection for a keyed request.}\n@example_request {\"type\":\"allowlist\",\"entries\":[\"former-partner@example.com\"]}\n\n@endpoint GET /email_inboxes/{inbox_id}/filters\n@desc List sender filters for an inbox\n@returns(200) {data: map{record_type: str, allowlist: [str], blocklist: [str]}} # The inbox's current sender allowlist and blocklist.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 503: Service unavailable (10016), including an unavailable upstream dependency or unavailable Edge idempotency protection for a keyed request.}\n\n@endpoint POST /email_inboxes/{inbox_id}/filters\n@desc Add sender filter entries to an inbox\n@required {type: str(allowlist/blocklist) # The list to change., entries: [str]}\n@returns(200) {data: map{record_type: str, allowlist: [str], blocklist: [str]}} # The inbox's current sender allowlist and blocklist.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 422: Validation Failed (10015) or changeset validation error., 503: Service unavailable (10016), including an unavailable upstream dependency or unavailable Edge idempotency protection for a keyed request.}\n@example_request {\"type\":\"blocklist\",\"entries\":[\"@spam.example\"]}\n\n@endpoint PUT /email_inboxes/{inbox_id}/filters\n@desc Replace sender filters for an inbox\n@optional {allowlist: [str], blocklist: [str]}\n@returns(200) {data: map{record_type: str, allowlist: [str], blocklist: [str]}} # The inbox's current sender allowlist and blocklist.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 422: Validation Failed (10015) or changeset validation error., 503: Service unavailable (10016), including an unavailable upstream dependency or unavailable Edge idempotency protection for a keyed request.}\n@example_request {\"allowlist\":[\"trusted@example.com\",\"@partner.example\"],\"blocklist\":[\"@spam.example\"]}\n\n@endpoint GET /email_inboxes/{inbox_id}/messages\n@desc List and search messages in an inbox\n@required {inbox_id: str(uuid) # Email inbox UUID.}\n@optional {filter[from]: str: any # Case-insensitive literal substring of the sender address., filter[subject]: str # Case-insensitive literal substring of the subject., filter[received_after]: str(date-time) # Inclusive ISO 8601 lower bound for the received timestamp., filter[received_before]: str(date-time) # Inclusive ISO 8601 upper bound for the received timestamp., filter[read]: bool # Whether the message has a read timestamp., filter[unread]: bool # Whether the message has no read timestamp. Set to `true` to return only unread messages., filter[label]: str # Returns only messages carrying this label. Matching is exact and case-sensitive. Reserved `telnyx:` labels can be filtered on even though they cannot be written by customers., filter[search]: str # Full-text query over subject and body, up to 500 characters., page[size]: int=25 # Number of results to return. Defaults to 25; maximum is 100., page[after]: str # Opaque cursor returned by the previous page.}\n@returns(200) {data: [any], meta: map{page_size: int, page_cursor: str}} # Paginated inbox messages.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 422: Validation Failed (10015) or changeset validation error., 503: Inbound message storage is temporarily unavailable.}\n\n@endpoint PATCH /email_inboxes/{inbox_id}/messages/{message_id}\n@desc Update an inbox message\n@required {inbox_id: str(uuid) # Email inbox UUID., message_id: str(uuid) # Inbound email message UUID., read_at: any # Set to `true` for server time, an ISO 8601 timestamp for an explicit read time, or `null` to mark unread.}\n@returns(200) {data: any} # Updated inbox message.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 422: Validation Failed (10015) or changeset validation error., 503: Service unavailable (10016), including an unavailable upstream dependency or unavailable Edge idempotency protection for a keyed request.}\n@example_request {\"read_at\":true}\n\n@endpoint POST /email_inboxes/{inbox_id}/messages/{message_id}/actions/forward\n@desc Forward an inbox message\n@required {inbox_id: str(uuid) # Email inbox UUID., message_id: str(uuid) # Inbound email message UUID., to: any # One recipient or a non-empty recipient array. Each recipient may be an email string or an object with `email` and optional `name`.}\n@optional {cc: any # One recipient or a recipient array. Each recipient may be an email string or an object with `email` and optional `name`., bcc: any # One recipient or a recipient array. Each recipient may be an email string or an object with `email` and optional `name`., text: str # Optional plain-text note prepended to the generated forwarded-message block. Blank values are treated as omitted., html: str # Optional HTML note prepended to the generated forwarded-message block. Blank values are treated as omitted.}\n@returns(202) {data: map{record_type: str, id: str(uuid), status: str, from: map{email: str, name: str}, to: [map], cc: [map], bcc: [map], reply_to: str?, subject: str, template_id: str(uuid)?, template_variables: map, tags: [str], metadata: map, attachments: [map], events: [map], created_at: str(date-time), scheduled_at: str(date-time), inline_css: bool, sandbox: bool, recipient_statuses: map, suppressed: [map]}, suppressed: [map]} # Forward accepted by the standard email send pipeline.\n@errors {400: Bad Request / Validation Failed (10015)., 401: Not authorized (10006)., 403: Forbidden (10007), such as domain not verified, suspended, degraded, or missing DKIM., 404: The inbox, source message, or sending domain was not found (10001)., 422: Forward validation failed (10015), or all recipients are suppressed., 429: Send rejected before message creation because the account daily recipient quota was exhausted (10011), the sender-domain graduation ceiling was exceeded (domain_graduation_limit_exceeded), or domain reputation is poor (reputation_suspended)., 503: Inbox message actions or the email domain service are temporarily unavailable (10016).}\n@example_request {\"to\":\"new@example.com\",\"cc\":[{\"email\":\"copy@example.com\"}],\"bcc\":[\"blind@example.com\"],\"text\":\"FYI\"}\n\n@endpoint POST /email_inboxes/{inbox_id}/messages/{message_id}/actions/reply\n@desc Reply to an inbox message\n@required {inbox_id: str(uuid) # Email inbox UUID., message_id: str(uuid) # Inbound email message UUID.}\n@optional {text: str # Plain-text reply body., html: str # HTML reply body.}\n@returns(202) {data: map{record_type: str, id: str(uuid), status: str, from: map{email: str, name: str}, to: [map], cc: [map], bcc: [map], reply_to: str?, subject: str, template_id: str(uuid)?, template_variables: map, tags: [str], metadata: map, attachments: [map], events: [map], created_at: str(date-time), scheduled_at: str(date-time), inline_css: bool, sandbox: bool, recipient_statuses: map, suppressed: [map]}, suppressed: [map]} # Reply accepted by the standard email send pipeline.\n@errors {400: Bad Request / Validation Failed (10015)., 401: Not authorized (10006)., 403: Forbidden (10007), such as domain not verified, suspended, degraded, or missing DKIM., 404: The inbox, source message, or sending domain was not found (10001)., 422: Reply validation failed (10015), or all recipients are suppressed., 429: Send rejected before message creation because the account daily recipient quota was exhausted (10011), the sender-domain graduation ceiling was exceeded (domain_graduation_limit_exceeded), or domain reputation is poor (reputation_suspended)., 503: Inbox message actions or the email domain service are temporarily unavailable (10016).}\n@example_request {\"text\":\"Thanks for the update.\"}\n\n@endpoint POST /email_inboxes/{inbox_id}/messages/{message_id}/actions/reply_all\n@desc Reply all to an inbox message\n@required {inbox_id: str(uuid) # Email inbox UUID., message_id: str(uuid) # Inbound email message UUID.}\n@optional {text: str # Plain-text reply body., html: str # HTML reply body.}\n@returns(202) {data: map{record_type: str, id: str(uuid), status: str, from: map{email: str, name: str}, to: [map], cc: [map], bcc: [map], reply_to: str?, subject: str, template_id: str(uuid)?, template_variables: map, tags: [str], metadata: map, attachments: [map], events: [map], created_at: str(date-time), scheduled_at: str(date-time), inline_css: bool, sandbox: bool, recipient_statuses: map, suppressed: [map]}, suppressed: [map]} # Reply-all message accepted by the standard email send pipeline.\n@errors {400: Bad Request / Validation Failed (10015)., 401: Not authorized (10006)., 403: Forbidden (10007), such as domain not verified, suspended, degraded, or missing DKIM., 404: The inbox, source message, or sending domain was not found (10001)., 422: Reply-all validation failed (10015), or all recipients are suppressed., 429: Send rejected before message creation because the account daily recipient quota was exhausted (10011), the sender-domain graduation ceiling was exceeded (domain_graduation_limit_exceeded), or domain reputation is poor (reputation_suspended)., 503: Inbox message actions or the email domain service are temporarily unavailable (10016).}\n@example_request {\"text\":\"Everyone, please review.\"}\n\n@endpoint POST /email_inboxes/{inbox_id}/messages/{message_id}/drafts\n@desc Create a reply draft\n@required {inbox_id: str(uuid) # Email inbox UUID., message_id: str(uuid) # Inbound message UUID to reply to.}\n@optional {from_email: str, from_name: str, to: [any], cc: [any], bcc: [any], reply_to: str, subject: str, text_body: str, html_body: str, text: str # Alias for `text_body`, matching the send endpoint., html: str # Alias for `html_body`, matching the send endpoint., headers: map, attachments: [map], labels: [str], tags: [str], metadata: map}\n@returns(201) {data: map{record_type: str, id: str(uuid), inbox_id: str(uuid), status: str, from: str?, from_name: str?, to: [map], cc: [map], bcc: [map], reply_to: str?, subject: str?, text_body: str?, html_body: str?, headers: map, attachments: [map], labels: [str], tags: [str], metadata: map, reply_to_message_id: str(uuid)?, thread_id: str(uuid)?, sent_message_id: str(uuid)?, sent_at: str(date-time)?, created_at: str(date-time), updated_at: str(date-time)}} # The created reply draft.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 422: Validation Failed (10015) or changeset validation error., 503: Drafts or the email domain service are temporarily unavailable (10016).}\n@example_request {\"text_body\":\"Thanks for the update — I will review today.\"}\n\n@endpoint DELETE /email_inboxes/{inbox_id}/messages/{message_id}/labels\n@desc Remove labels from an inbox message\n@required {inbox_id: str(uuid) # Email inbox UUID., message_id: str(uuid) # Inbound message UUID., labels: [str] # One or more labels. Each label is a freeform, case-sensitive string of at most 255 characters; a message or thread may carry at most 50 labels. The `telnyx:` prefix is a reserved system namespace and is rejected on customer writes.}\n@returns(200) {data: any} # The updated message, including its current label set.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 422: Validation Failed (10015) or changeset validation error., 503: Inbound label storage is temporarily unavailable.}\n@example_request {\"labels\":[\"spam\"]}\n\n@endpoint POST /email_inboxes/{inbox_id}/messages/{message_id}/labels\n@desc Add labels to an inbox message\n@required {inbox_id: str(uuid) # Email inbox UUID., message_id: str(uuid) # Inbound message UUID., labels: [str] # One or more labels. Each label is a freeform, case-sensitive string of at most 255 characters; a message or thread may carry at most 50 labels. The `telnyx:` prefix is a reserved system namespace and is rejected on customer writes.}\n@returns(200) {data: any} # The updated message, including its current label set.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 422: Validation Failed (10015) or changeset validation error., 503: Inbound label storage is temporarily unavailable.}\n@example_request {\"labels\":[\"spam\",\"urgent\"]}\n\n@endpoint GET /email_inboxes/{inbox_id}/threads\n@desc List threads in an inbox\n@required {inbox_id: str(uuid) # Email inbox UUID.}\n@optional {page[size]: int=25: any # Number of results to return. Defaults to 25; maximum is 100., page[after]: str # Opaque cursor returned by the previous page., filter[label]: str # Returns only threads carrying this label. Thread labels are independent of the labels on the thread's messages.}\n@returns(200) {data: [map], meta: map{page_size: int, page_cursor: str}} # Paginated inbox threads.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 422: Validation Failed (10015) or changeset validation error., 503: Inbound thread storage is temporarily unavailable.}\n\n@endpoint GET /email_inboxes/{inbox_id}/threads/{thread_id}\n@desc Get a thread and a page of its messages\n@required {inbox_id: str(uuid) # Email inbox UUID., thread_id: str(uuid) # Email thread UUID.}\n@optional {page[size]: int=25: any # Number of thread messages to return. Defaults to 25; maximum is 100., page[after]: str # Opaque message cursor returned by the previous thread-detail page.}\n@returns(200) {data: any, meta: map{page_size: int, page_cursor: str}} # Thread summary and chronological messages.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 422: Validation Failed (10015) or changeset validation error., 503: Inbound thread storage is temporarily unavailable.}\n\n@endpoint DELETE /email_inboxes/{inbox_id}/threads/{thread_id}/labels\n@desc Remove labels from an inbox thread\n@required {inbox_id: str(uuid) # Email inbox UUID., thread_id: str(uuid) # Thread UUID., labels: [str] # One or more labels. Each label is a freeform, case-sensitive string of at most 255 characters; a message or thread may carry at most 50 labels. The `telnyx:` prefix is a reserved system namespace and is rejected on customer writes.}\n@returns(200) {data: map{id: str(uuid), record_type: str, inbox_id: str(uuid), labels: [str]}} # The thread identity and its current label set.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 422: Validation Failed (10015) or changeset validation error., 503: Inbound label storage is temporarily unavailable.}\n@example_request {\"labels\":[\"needs_review\"]}\n\n@endpoint POST /email_inboxes/{inbox_id}/threads/{thread_id}/labels\n@desc Add labels to an inbox thread\n@required {inbox_id: str(uuid) # Email inbox UUID., thread_id: str(uuid) # Thread UUID., labels: [str] # One or more labels. Each label is a freeform, case-sensitive string of at most 255 characters; a message or thread may carry at most 50 labels. The `telnyx:` prefix is a reserved system namespace and is rejected on customer writes.}\n@returns(200) {data: map{id: str(uuid), record_type: str, inbox_id: str(uuid), labels: [str]}} # The thread identity and its current label set.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 422: Validation Failed (10015) or changeset validation error., 503: Inbound label storage is temporarily unavailable.}\n@example_request {\"labels\":[\"needs_review\"]}\n\n@endgroup\n\n@group email_messages\n@endpoint DELETE /email_messages\n@desc Delete email messages by address\n@required {address: str(email) # Sender or recipient address to delete. Matching is trimmed and case-insensitive.}\n@returns(204) Matching account-scoped email data deleted successfully.\n@errors {400: Bad Request / Validation Failed (10015)., 401: Not authorized (10006)., 404: Resource not found (10001)., 500: Internal server error (10019).}\n\n@endpoint GET /email_messages\n@desc List email messages\n@optional {page_size: int=25 # Number of results to return. Defaults to 25; maximum is 100. Invalid values are clamped to the valid range., page_cursor: str # Opaque URL-safe Base64 cursor returned by a previous list response., filter[tags]: str # Comma-separated tags. Each segment is trimmed, and messages having at least one supplied tag are returned; matching is exact and case-sensitive after trimming. Because commas delimit values and surrounding whitespace is removed, this filter cannot represent stored tags containing literal commas or leading/trailing whitespace. An empty value omits the filter. Empty segments and non-string/nested query shapes return HTTP 400., filter[metadata]: str # Metadata containment filter, supplied as a JSON object or comma-separated `key=value` pairs. All supplied key/value pairs must be contained in the message metadata. An empty value or empty JSON object omits the filter. Malformed values, valid non-object JSON, pairs without `=`, empty keys, and non-string/nested query shapes return HTTP 400.}\n@returns(200) {data: [map], meta: map{page_size: int, page_cursor: str}} # Paginated list of email messages.\n@errors {400: The tags or metadata filter is malformed or uses an unsupported query shape., 401: Not authorized (10006).}\n\n@endpoint POST /email_messages\n@desc Create or send an email message\n@required {from: any, to: [any]}\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key., from_name: str # Optional display name for string `from`; overrides `from.name` when provided., cc: [any], bcc: [any], reply_to: any, subject: str # Required unless `template_id` is supplied. When using a template, the template's subject is rendered; if the template has no subject or renders empty, the request returns 400., html_body: str # HTML email body. Returned only by `GET /email_messages/{id}`; omitted from create and list responses., text_body: str # Plain text email body. Returned only by `GET /email_messages/{id}`; omitted from create and list responses., headers: map # Custom email headers. Write-only; not returned in responses., attachments: [map{filename: str, content_type: str, content: str, disposition: str, content_id: str}], tags: [str] # Tags for categorization and filtering. Stored on the message, returned on message responses, and propagated to Email Detail Records. Usable in `filter[tags]` when listing messages., group_id: str(uuid) # Optional unsubscribe-group UUID used for group-scoped suppression checks and unsubscribe handling., ignore_suppression: bool=false # When true, allows delivery to recipients whose suppressions explicitly permit an override. Hard bounces, spam complaints, and invalid-address suppressions cannot be overridden. Requires the `email:override` API scope., metadata: map # Custom metadata key/value pairs. Stored on the message, returned on message responses, and propagated to Email Detail Records. Usable in `filter[metadata]` when listing messages., tracking_settings: map{open_tracking: bool, click_tracking: bool} # Per-send open and click tracking overrides. Omitted properties inherit the sender domain's tracking settings., template_id: str(uuid), template_variables: map=[object Object] # Variables for Liquid template rendering. Non-object values may cause a 422 validation error on message creation, but are silently treated as an empty object for template rendering. When the template enables `strict_variables`, a missing required variable fails the request with 422 (single send) or a per-item `unprocessable_entity` error (batch) naming the variable; no message is persisted for the failed item., scheduled_at: str(date-time) # Future ISO 8601 delivery time. Invalid or non-future timestamps are rejected. Single sends return HTTP 422; in batch sends the invalid item is reported in the 207 per-item errors while other items continue. `send_at` remains a deprecated request alias. A non-null `scheduled_at` takes precedence over `send_at`; when `scheduled_at` is omitted or null, `send_at` is used., send_at: str(date-time) # Deprecated alias for `scheduled_at`., inline_css: bool=false, sandbox_mode: bool=false # Validates and accepts the message without injecting it into the MTA or outbound Kafka path. Nothing is delivered: sandbox records are non-billable, consume no daily-send-limit quota, and feed no delivery-reputation signals.  The reserved sandbox test-recipient domain is `test.telnyx.com`. In sandbox mode, these addresses produce deterministic recipient-scoped lifecycle events:  - `delivered@test.telnyx.com`: queued -> sending -> sent -> delivered - `hard-bounce@test.telnyx.com`: queued -> sending -> sent -> bounced (permanent) - `soft-bounce@test.telnyx.com`: queued -> sending -> sent -> bounced (transient) - `complaint@test.telnyx.com`: queued -> sending -> sent -> complained - `suppressed@test.telnyx.com`: queued -> suppressed - `invalid@test.telnyx.com`: queued -> sending -> failed (invalid recipient) - `dkim-fail@test.telnyx.com`: queued -> sending -> failed (DKIM unavailable) - `rate-limit@test.telnyx.com`: queued -> sending -> failed (rate limit exceeded)  Matching is case-insensitive for both the local part and the domain and requires the exact domain `test.telnyx.com` — subdomains and other domains do not match. Mixed sandbox sends simulate only reserved test recipients; other recipients retain ordinary sandbox behavior (accepted, no delivery attempted). Hard-bounce and complaint outcomes also use the normal automatic-suppression pipeline. Non-sandbox sends to these addresses use the normal delivery path., in_reply_to_message_id: str(uuid) # Telnyx message UUID of the message this send replies to. When provided, the API sets RFC 5322 `In-Reply-To` and `References` headers on the outbound MIME so the recipient's mailbox (Gmail/Outlook) threads it correctly. The parent is looked up under the caller's account scope; a UUID belonging to another account yields a non-enumerating 404.  Wire-only (Phase 1): the API sets the headers and does NOT resolve or mutate `thread_id` on the server side. Messages sent without this parameter are standalone (no threading headers injected).  Cannot be combined with `forward_of_message_id` (422)., reply_to_all: bool=false # Indicates a reply-all intent. In Phase 1 (wire-only) this does not change the threading headers — recipient selection is customer- controlled (`to`/`cc`), and a thread is not defined by its audience. When the referenced message has no thread context, reply-all degrades to a plain reply (parent ID only in `References`). The resolution engine (separate work) will expand the ancestor chain at a later phase with no API change.  Only meaningful alongside `in_reply_to_message_id`., forward_of_message_id: str(uuid) # Telnyx message UUID of the message this send forwards. Forwarded messages start a NEW thread per RFC 5322 — NO `In-Reply-To` or `References` headers are set on the outbound MIME. The id is recorded in the message's metadata for EDR provenance only.  The id is validated as a UUID but is NOT looked up against the message store — existence is the caller's responsibility (the forward is pure metadata; it does not affect delivery). Cannot be combined with `in_reply_to_message_id` (422).}\n@returns(202) {data: map{record_type: str, id: str(uuid), status: str, from: map{email: str, name: str}, to: [map], cc: [map], bcc: [map], reply_to: str?, subject: str, template_id: str(uuid)?, template_variables: map, tags: [str], metadata: map, attachments: [map], events: [map], created_at: str(date-time), scheduled_at: str(date-time), inline_css: bool, sandbox: bool, recipient_statuses: map, suppressed: [map]}, suppressed: [map]} # Message queued, scheduled, or sandbox-created.\n@errors {400: Bad Request / Validation Failed (10015). Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015., 401: Not authorized (10006)., 403: Forbidden (10007), such as domain not verified, suspended, degraded, or missing DKIM., 404: Resource not found (10001)., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Request body exceeds the 8, 000,000-byte limit for this endpoint., 422: Validation failed (including an invalid or non-future `scheduled_at`/`send_at`), send-time template rendering failed (including a strict-variable failure naming the missing required variable), or all recipients suppressed (code `recipient_suppressed`, includes top-level `suppressed` array). Reusing an Idempotency-Key with a different request also returns 422 (10027)., 429: Send rejected before message creation because the account daily recipient quota was exhausted (10011), the sender-domain graduation ceiling was exceeded (domain_graduation_limit_exceeded), or domain reputation is poor (reputation_suspended)., 503: Service unavailable (10016), including an unavailable upstream dependency or unavailable Edge idempotency protection for a keyed request.}\n@example_request {\"from\":\"sender@example.com\",\"to\":[\"recipient@example.com\"],\"subject\":\"Hello from Telnyx\",\"text_body\":\"This is a test email.\"}\n\n@endpoint POST /email_messages/batch\n@desc Create a batch of email messages\n@required {messages: [map{from!: any, from_name: str, to!: [any], cc: [any], bcc: [any], reply_to: any, subject: str, html_body: str, text_body: str, headers: map, attachments: [map], tags: [str], group_id: str(uuid), ignore_suppression: bool, metadata: map, tracking_settings: map, template_id: str(uuid), template_variables: map, scheduled_at: str(date-time), send_at: str(date-time), inline_css: bool, sandbox_mode: bool}] # Array of email messages to send. Up to 1,000 messages per batch request. Each message is validated and sent independently; per-message failures do not affect other messages in the batch.}\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key., sandbox_mode: bool=false # Applies sandbox mode to all messages in the batch and overrides any per-message `sandbox_mode` value — each message's effective `sandbox_mode` is exactly this envelope value. Reserved recipients at `test.telnyx.com` produce the deterministic event chains documented on CreateEmailRequest.sandbox_mode; no batch item is injected into the MTA or outbound Kafka path. Sandbox batch items are non-billable, consume no daily-send-limit quota, and feed no delivery-reputation signals.}\n@returns(207) {data: [map], errors: [map], meta: map{total: int, succeeded: int, failed: int}} # Multi-Status — returned after request-wide admission checks pass and item processing runs. Each message is validated and sent independently; per-message failures do not affect other messages in the batch. An invalid or non-future `scheduled_at`/`send_at` is reported as a per-item `unprocessable_entity` error while the remaining items continue. When all messages succeed, `errors` is empty and every item is in `data`; otherwise `data` contains successes and `errors` contains failures. Request-wide gates can instead return 4xx or 5xx.\n@errors {400: Bad Request / Validation Failed (10015). Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015., 401: Not authorized (10006)., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Request body exceeds the 8, 000,000-byte limit for this endpoint., 422: The Idempotency-Key was already used for a different request (10027)., 429: Send rejected before message creation because the account daily recipient quota was exhausted (10011), the sender-domain graduation ceiling was exceeded (domain_graduation_limit_exceeded), or domain reputation is poor (reputation_suspended)., 503: Service unavailable (10016), including an unavailable upstream dependency or unavailable Edge idempotency protection for a keyed request.}\n@example_request {\"sandbox_mode\":false,\"messages\":[{\"from\":\"sender@example.com\",\"to\":[\"recipient1@example.com\"],\"subject\":\"Hello 1\",\"text_body\":\"Message 1\"},{\"from\":\"sender@example.com\",\"to\":[\"recipient2@example.com\"],\"subject\":\"Hello 2\",\"text_body\":\"Message 2\"}]}\n\n@endpoint GET /email_messages/{email_id}/events\n@desc List events for an email message\n@required {email_id: str(uuid) # Email message UUID.}\n@optional {page_size: int=25 # Number of results to return. Defaults to 25; maximum is 100. Invalid values are clamped to the valid range., page_cursor: str # Opaque URL-safe Base64 cursor returned by a previous list response.}\n@returns(200) {data: [map], meta: map{page_size: int, page_cursor: str}} # Paginated list of message events.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001).}\n\n@endpoint GET /email_messages/{email_id}/recipients\n@desc List recipients for an email message\n@required {email_id: str(uuid) # Email message UUID.}\n@optional {page_size: int=25 # Number of results to return. Defaults to 25; maximum is 100. Invalid values are clamped to the valid range., page_cursor: str # Opaque URL-safe Base64 cursor returned by a previous list response., status: str(queued/sending/sent/deferred/delivered/bounced/failed/gw_reject/cancelled/injection_timeout/expired) # Filter recipients by status., kind: str(to/cc/bcc) # Filter recipients by address kind.}\n@returns(200) {data: [map], meta: map{page_size: int, page_cursor: str?}} # Paginated list of recipients.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001).}\n\n@endpoint GET /email_messages/{email_id}/recipients/{recipient_id}\n@desc Get a single recipient's delivery state\n@required {email_id: str(uuid) # Email message UUID., recipient_id: str(uuid) # Recipient UUID.}\n@returns(200) {data: map{record_type: str, id: str(uuid), message_id: str(uuid), address: str(email)?, kind: str, status: str, billable: bool, sent_at: str(date-time)?, delivered_at: str(date-time)?, failed_at: str(date-time)?, smtp_code: int?, smtp_response: str?}} # Recipient delivery state.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001).}\n\n@endpoint DELETE /email_messages/{email_id}/schedule\n@desc Cancel a scheduled email message\n@required {email_id: str(uuid) # Email message UUID.}\n@returns(200) {data: map{record_type: str, id: str(uuid), status: str, from: map{email: str, name: str}, to: [map], cc: [map], bcc: [map], reply_to: str?, subject: str, template_id: str(uuid)?, template_variables: map, tags: [str], metadata: map, attachments: [map], events: [map], created_at: str(date-time), scheduled_at: str(date-time), inline_css: bool, sandbox: bool, recipient_statuses: map, suppressed: [map]}, suppressed: [map]} # Scheduled email cancelled.\n@errors {400: Bad Request / Validation Failed (10015)., 401: Not authorized (10006)., 404: Resource not found (10001).}\n\n@endpoint PATCH /email_messages/{email_id}/schedule\n@desc Reschedule a scheduled email message\n@required {email_id: str(uuid) # Email message UUID., scheduled_at: str(date-time) # New ISO 8601 delivery time. Must be strictly in the future.}\n@returns(200) {data: any} # Scheduled email rescheduled. The response matches the single-message GET representation.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 409: The email is not scheduled or its scheduled-send worker is already processing it., 422: `scheduled_at` is missing, invalid ISO 8601, or not in the future.}\n@example_request {\"scheduled_at\":\"2099-08-07T14:30:00Z\"}\n\n@endpoint DELETE /email_messages/{id}\n@desc Delete an email message\n@required {id: str(uuid) # Email message UUID.}\n@returns(204) Email data deleted successfully.\n@errors {400: Bad Request / Validation Failed (10015)., 401: Not authorized (10006)., 404: Resource not found (10001)., 500: Internal server error (10019).}\n\n@endpoint GET /email_messages/{id}\n@desc Get an email message\n@required {id: str(uuid) # Email message UUID.}\n@returns(200) {data: any} # Email message details, including plain-text and HTML bodies.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001).}\n\n@endgroup\n\n@group email_templates\n@endpoint GET /email_templates\n@desc List email templates\n@optional {page_size: int=25 # Number of results to return. Defaults to 25; maximum is 100. Invalid values are clamped to the valid range., page_cursor: str # Opaque URL-safe Base64 cursor returned by a previous list response.}\n@returns(200) {data: [map], meta: map{page_size: int, page_cursor: str}} # Paginated list of templates.\n@errors {401: Not authorized (10006).}\n\n@endpoint POST /email_templates\n@desc Create an email template\n@required {name: str # Letters, numbers, spaces, hyphens, and underscores only.}\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key., subject: str # Liquid template subject., html_body: str # Liquid template HTML body., text_body: str # Liquid template text body., variables: [str] # Template variables. Auto-extracted from subject/body fields when absent., strict_variables: bool=false # Per-template strict variable-validation setting. Defaults to `false` for backward compatibility. When `true`, a send or render that is missing a variable marked `required: true` in `variable_schema` fails with 422 naming the variable. Missing optional variables never fail; their schema `default` (when set) is applied to the render., autoescape: bool=false # Per-template HTML autoescaping setting. Defaults to `false` for backward compatibility. When `true`, the rendered `html_body` HTML-escapes each Liquid expression's output at the output boundary (after its filters run, before concatenation with literal template markup). Input values are never mutated and `subject`/`text_body` are never autoescaped. The boundary escape is idempotent: HTML entities already present in the output (e.g. from an explicit `escape` filter) are preserved, so an explicit `escape`/`escape_once` is never double-escaped, and markup introduced by any later filter in the chain is still escaped., variable_schema: map # Structured variable requirements. Required variables cannot define defaults; invalid combinations return 422. This is independent of the legacy `variables` array. On render with `strict_variables` enabled: `required` variables must be supplied as non-empty values — absent, `null`, empty string, empty object `{}`, and empty array `[]` all fail with 422 naming the variable, while present values such as `false` and `0` pass (they are present, not empty). Optional variables fall back to their `default` when absent.}\n@returns(201) {data: map{record_type: str, id: str(uuid), name: str, subject: str?, html_body: str?, text_body: str?, variables: [str], strict_variables: bool, autoescape: bool, variable_schema: map?, created_at: str(date-time), updated_at: str(date-time)}} # Template created.\n@errors {400: Bad Request / Validation Failed (10015). Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015., 401: Not authorized (10006)., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Request body exceeds the 8, 000,000-byte limit for this endpoint., 422: Validation Failed (10015) or changeset validation error. Reusing an Idempotency-Key with a different request also returns 422 (10027)., 503: Service unavailable (10016), including an unavailable upstream dependency or unavailable Edge idempotency protection for a keyed request.}\n@example_request {\"name\":\"Welcome Email\",\"subject\":\"Welcome, {{ first_name }}!\",\"html_body\":\"<h1>Hello {{ first_name }}</h1>\",\"text_body\":\"Hello {{ first_name }}\"}\n\n@endpoint DELETE /email_templates/{id}\n@desc Delete an email template\n@required {id: str(uuid) # Email template UUID.}\n@returns(204) Template deleted. Empty response body.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 422: Validation Failed (10015) or changeset validation error.}\n\n@endpoint GET /email_templates/{id}\n@desc Get an email template\n@required {id: str(uuid) # Email template UUID.}\n@returns(200) {data: map{record_type: str, id: str(uuid), name: str, subject: str?, html_body: str?, text_body: str?, variables: [str], strict_variables: bool, autoescape: bool, variable_schema: map?, created_at: str(date-time), updated_at: str(date-time)}} # Template details.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001).}\n\n@endpoint PATCH /email_templates/{id}\n@desc Update an email template\n@required {id: str(uuid) # Email template UUID.}\n@optional {name: str, subject: str # Liquid template subject., html_body: str # Liquid template HTML body., text_body: str # Liquid template text body., variables: [str], strict_variables: bool # Per-template strict variable-validation setting., autoescape: bool # Per-template HTML autoescaping setting., variable_schema: map # Structured variable requirements. Required variables cannot define defaults; invalid combinations return 422. Set to `null` to clear the schema.}\n@returns(200) {data: map{record_type: str, id: str(uuid), name: str, subject: str?, html_body: str?, text_body: str?, variables: [str], strict_variables: bool, autoescape: bool, variable_schema: map?, created_at: str(date-time), updated_at: str(date-time)}} # Template updated.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 422: Validation Failed (10015) or changeset validation error.}\n@example_request {\"subject\":\"Welcome aboard, {{first_name}}!\"}\n\n@endpoint PUT /email_templates/{id}\n@desc Replace an email template\n@required {id: str(uuid) # Email template UUID.}\n@optional {name: str, subject: str # Liquid template subject., html_body: str # Liquid template HTML body., text_body: str # Liquid template text body., variables: [str], strict_variables: bool # Per-template strict variable-validation setting., autoescape: bool # Per-template HTML autoescaping setting., variable_schema: map # Structured variable requirements. Required variables cannot define defaults; invalid combinations return 422. Set to `null` to clear the schema.}\n@returns(200) {data: map{record_type: str, id: str(uuid), name: str, subject: str?, html_body: str?, text_body: str?, variables: [str], strict_variables: bool, autoescape: bool, variable_schema: map?, created_at: str(date-time), updated_at: str(date-time)}} # Template updated.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 422: Validation Failed (10015) or changeset validation error.}\n@example_request {\"subject\":\"Welcome aboard, {{first_name}}!\"}\n\n@endpoint POST /email_templates/{id}/render\n@desc Render an email template\n@required {id: str(uuid) # Email template UUID.}\n@optional {template_variables: map=[object Object] # Variables for Liquid template rendering. Non-object values are silently treated as an empty object.}\n@returns(200) {data: any} # Rendered template content.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 422: Standalone template render failure (10015).}\n@example_request {\"template_variables\":{\"first_name\":\"Ada\"}}\n\n@endgroup\n\n@group email_threads\n@endpoint GET /email_threads\n@desc List threads across every inbox in the account\n@optional {filter[inbox_id]: [str(uuid)]: any # Restrict results to one or more inboxes. Repeat the parameter (`filter[inbox_id][]=...&filter[inbox_id][]=...`) or pass a comma-separated list. Omit to list every inbox in the account. Inboxes outside the account are silently excluded. If the filter is present, it must contain at least one non-empty UUID., page[size]: int=25 # Number of results to return. Defaults to 25; maximum is 100., page[after]: str # Opaque cursor returned by the previous page., filter[label]: str # Returns only threads carrying this label. Matching is exact and case-sensitive. Thread labels are independent of the labels on the thread's messages.}\n@returns(200) {data: [map], meta: map{page_size: int, page_cursor: str}} # Paginated account-wide threads.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 422: Validation Failed (10015) or changeset validation error., 503: Inbound thread storage is temporarily unavailable.}\n\n@endpoint GET /email_threads/{thread_id}\n@desc Get an account-wide thread and a page of its messages\n@required {thread_id: str(uuid) # Email thread UUID., inbox_id: str(uuid) # Inbox UUID that, together with `thread_id`, identifies the thread.}\n@optional {page[size]: int=25: any # Number of thread messages to return. Defaults to 25; maximum is 100., page[after]: str # Opaque message cursor returned by the previous thread-detail page.}\n@returns(200) {data: any, meta: map{page_size: int, page_cursor: str}} # Thread summary and chronological messages.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001)., 422: Validation Failed (10015) or changeset validation error., 503: Inbound thread storage is temporarily unavailable.}\n\n@endgroup\n\n@group email_unsubscribe_groups\n@endpoint GET /email_unsubscribe_groups\n@desc List unsubscribe groups\n@optional {page[number]: int=1: any # Offset page number (≥1, default 1)., page[size]: int=25 # Page size (1–100, default 25).}\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_pages: int, total_results: int}} # Groups.\n@errors {401: Missing or invalid gateway auth., 406: Framework-rendered error (e.g. 406 Not Acceptable, 405 Method Not Allowed, 415 Unsupported Media Type). HTTP status matches the error and the body `code` carries that same status (e.g. `\"406\"`, not a hardcoded `\"500\"`). The explicit `500.json` clause still emits `code: \"500\"` for genuine 500s.}\n\n@endpoint POST /email_unsubscribe_groups\n@desc Create an unsubscribe group\n@required {name: str}\n@optional {description: str}\n@returns(201) {data: map{id: str(uuid), record_type: str, name: str, description: str?, created_at: str(date-time), updated_at: str(date-time)}} # Created.\n@errors {401: Missing or invalid gateway auth., 406: Framework-rendered error (e.g. 406 Not Acceptable, 405 Method Not Allowed, 415 Unsupported Media Type). HTTP status matches the error and the body `code` carries that same status (e.g. `\"406\"`, not a hardcoded `\"500\"`). The explicit `500.json` clause still emits `code: \"500\"` for genuine 500s., 422: Validation error (changeset or internal `Params`). One error object per field, `source.pointer /data/attributes/`.}\n@example_request {\"name\":\"Marketing Newsletter\",\"description\":\"Weekly product updates and promotions\"}\n\n@endpoint DELETE /email_unsubscribe_groups/{id}\n@desc Delete an unsubscribe group\n@optional {force: any # Force-delete a group with active suppressions. Only `\"true\"` (string) or `true` (bool) are truthy; all other values are false.}\n@returns(204) Deleted.\n@errors {401: Missing or invalid gateway auth., 404: Resource not found (cross-account lookups and malformed UUIDs also return 404 — no leak)., 406: Framework-rendered error (e.g. 406 Not Acceptable, 405 Method Not Allowed, 415 Unsupported Media Type). HTTP status matches the error and the body `code` carries that same status (e.g. `\"406\"`, not a hardcoded `\"500\"`). The explicit `500.json` clause still emits `code: \"500\"` for genuine 500s., 409: Group has active suppressions and `force` is false., 422: Validation error (changeset or internal `Params`). One error object per field, `source.pointer /data/attributes/`.}\n\n@endpoint GET /email_unsubscribe_groups/{id}\n@desc Retrieve an unsubscribe group\n@returns(200) {data: map{id: str(uuid), record_type: str, name: str, description: str?, created_at: str(date-time), updated_at: str(date-time)}} # The group.\n@errors {401: Missing or invalid gateway auth., 404: Resource not found (cross-account lookups and malformed UUIDs also return 404 — no leak)., 406: Framework-rendered error (e.g. 406 Not Acceptable, 405 Method Not Allowed, 415 Unsupported Media Type). HTTP status matches the error and the body `code` carries that same status (e.g. `\"406\"`, not a hardcoded `\"500\"`). The explicit `500.json` clause still emits `code: \"500\"` for genuine 500s.}\n\n@endpoint PATCH /email_unsubscribe_groups/{id}\n@desc Update an unsubscribe group\n@optional {name: str, description: str}\n@returns(200) {data: map{id: str(uuid), record_type: str, name: str, description: str?, created_at: str(date-time), updated_at: str(date-time)}} # The updated group.\n@errors {401: Missing or invalid gateway auth., 404: Resource not found (cross-account lookups and malformed UUIDs also return 404 — no leak)., 406: Framework-rendered error (e.g. 406 Not Acceptable, 405 Method Not Allowed, 415 Unsupported Media Type). HTTP status matches the error and the body `code` carries that same status (e.g. `\"406\"`, not a hardcoded `\"500\"`). The explicit `500.json` clause still emits `code: \"500\"` for genuine 500s., 422: Validation error (changeset or internal `Params`). One error object per field, `source.pointer /data/attributes/`.}\n@example_request {\"description\":\"Weekly product updates and promotions\"}\n\n@endpoint GET /email_unsubscribe_groups/{id}/suppressions\n@desc List suppressions in a group\n@optional {page[number]: int=1: any # Offset page number (≥1, default 1)., page[size]: int=25 # Page size (1–100, default 25).}\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_pages: int, total_results: int}} # Group suppressions.\n@errors {401: Missing or invalid gateway auth., 404: Resource not found (cross-account lookups and malformed UUIDs also return 404 — no leak)., 406: Framework-rendered error (e.g. 406 Not Acceptable, 405 Method Not Allowed, 415 Unsupported Media Type). HTTP status matches the error and the body `code` carries that same status (e.g. `\"406\"`, not a hardcoded `\"500\"`). The explicit `500.json` clause still emits `code: \"500\"` for genuine 500s.}\n\n@endpoint POST /email_unsubscribe_groups/{id}/suppressions\n@desc Add a group suppression\n@required {to: str}\n@returns(200) {data: map{id: str(uuid), record_type: str, domain_id: str(uuid)?, group_id: str(uuid)?, from: str?, to: str, reason: str, source: str, scope: str, status: str, created_at: str(date-time), updated_at: str(date-time), expires_at: str(date-time)?}} # Idempotent — already existed.\n@returns(201) {data: map{id: str(uuid), record_type: str, domain_id: str(uuid)?, group_id: str(uuid)?, from: str?, to: str, reason: str, source: str, scope: str, status: str, created_at: str(date-time), updated_at: str(date-time), expires_at: str(date-time)?}} # Created.\n@errors {401: Missing or invalid gateway auth., 404: Resource not found (cross-account lookups and malformed UUIDs also return 404 — no leak)., 406: Framework-rendered error (e.g. 406 Not Acceptable, 405 Method Not Allowed, 415 Unsupported Media Type). HTTP status matches the error and the body `code` carries that same status (e.g. `\"406\"`, not a hardcoded `\"500\"`). The explicit `500.json` clause still emits `code: \"500\"` for genuine 500s., 422: Validation error (changeset or internal `Params`). One error object per field, `source.pointer /data/attributes/`.}\n@example_request {\"to\":\"user@example.com\"}\n\n@endpoint DELETE /email_unsubscribe_groups/{id}/suppressions/{email}\n@desc Remove a group suppression\n@returns(204) Removed.\n@errors {401: Missing or invalid gateway auth., 404: Resource not found (cross-account lookups and malformed UUIDs also return 404 — no leak)., 406: Framework-rendered error (e.g. 406 Not Acceptable, 405 Method Not Allowed, 415 Unsupported Media Type). HTTP status matches the error and the body `code` carries that same status (e.g. `\"406\"`, not a hardcoded `\"500\"`). The explicit `500.json` clause still emits `code: \"500\"` for genuine 500s., 422: Validation error (changeset or internal `Params`). One error object per field, `source.pointer /data/attributes/`.}\n\n@endgroup\n\n@group email_validations\n@endpoint POST /email_validations\n@desc Validate a single email address\n@required {email: str # Email address to validate. Any non-empty string is accepted; invalid syntax returns valid=false rather than a request error.}\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key.}\n@returns(200) {data: map{record_type: str, email: str, valid: bool, risk_score: num(float), did_you_mean: str, checks: map{syntax: map{pass: bool, details: str}, mx: map{pass: bool, details: str}, disposable: map{pass: bool, details: str}, role_based: map{pass: bool, details: str}, typo: any}}} # Email validation result.\n@errors {400: Bad Request / Validation Failed (10015). Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015., 401: Not authorized (10006)., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Request body exceeds the 8, 000,000-byte limit for this endpoint., 422: The Idempotency-Key was already used for a different request (10027)., 503: Service unavailable (10016), including an unavailable upstream dependency or unavailable Edge idempotency protection for a keyed request.}\n@example_request {\"email\":\"user@example.com\"}\n\n@endpoint POST /email_validations/batch\n@desc Create a batch email validation job\n@required {emails: [str]}\n@optional {Idempotency-Key: str # Optional opaque, unquoted key for safely retrying the same logical request. Keys must contain 1 to 255 letters, numbers, hyphens, or underscores. Generate a unique UUID v4 for each operation and reuse it only when retrying that operation with the same request. Invalid headers—including duplicate, empty, malformed, or overlong values—return 400 with error code 10015. A request already in progress with the same key returns 409; reusing the key with a different request returns 422. Only successful responses are replayed, for up to 24 hours. Do not include sensitive data in the key., webhook_url: str(uri) # URL for batch completion webhook. Empty string is treated as omitted. SSRF-protected; private/reserved IPs and internal hostnames are rejected.}\n@returns(202) {data: map{record_type: str, id: str(uuid), status: str, total: int, duplicates_removed: int, webhook_url: str(uri)}} # Batch validation job accepted. Poll GET /email_validations/batch/{id} with the returned batch id to retrieve results.\n@errors {400: Missing or invalid email list, or batch size exceeded. Invalid, duplicate, empty, malformed, or overlong Idempotency-Key headers are rejected by Edge with HTTP 400 and error code 10015., 401: Not authorized (10006)., 409: A request with the same Idempotency-Key is still being processed (10036). Retry later with the same key and request., 413: Request body exceeds the 8, 000,000-byte limit for this endpoint., 422: Changeset validation error (e.g. invalid webhook_url). Reusing an Idempotency-Key with a different request also returns 422 (10027)., 500: Internal server error (10019)., 503: Service unavailable (10016), including an unavailable upstream dependency or unavailable Edge idempotency protection for a keyed request.}\n@example_request {\"emails\":[\"user@example.com\",\"admin@example.org\"],\"webhook_url\":\"https://example.com/webhooks/email-validation\"}\n\n@endpoint GET /email_validations/batch/{id}\n@desc Get a batch email validation job\n@required {id: str(uuid) # Email validation batch UUID.}\n@returns(200) {data: any} # Batch validation job status.\n@errors {401: Not authorized (10006)., 404: Resource not found (10001).}\n\n@endgroup\n\n@group enterprises\n@endpoint GET /enterprises\n@desc List enterprises\n@optional {page[number]: int=1: any # 1-based page number. Out-of-range values return an empty page with correct meta., page[size]: int=10 # Items per page. Default 10. Maximum 250; values above are clamped to 250., legal_name: str # Filter by legal name (partial match)., filter[legal_name][contains]: str # Case-insensitive partial match on legal name.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Paginated list of enterprises.\n@errors {401: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint POST /enterprises\n@desc Create an enterprise\n@required {legal_name: str # Legal name of the enterprise., organization_type: str(commercial/government/non_profit) # Organization category for vetting purposes: - `commercial` - for-profit business entities (LLC, corp, partnership, sole proprietorship). Most callers fall here. - `government` - federal/state/local government bodies. - `non_profit` - registered 501(c)(3)/equivalent (incl. educational institutions, charities, religious organisations)., country_code: str # ISO 3166-1 alpha-2 country code. Currently `US` and `CA` are supported., website: str(uri), fein: str # US Federal Employer Identification Number (`NN-NNNNNNN`) or Canadian equivalent., industry: str(accounting/finance/billing/collections/business/charity/nonprofit/communications/telecom/customer service/support/delivery/shipping/logistics/education/financial/banking/government/public/healthcare/health/pharmacy/medical/insurance/legal/law/notifications/scheduling/real estate/property/retail/ecommerce/sales/marketing/software/technology/tech/media/surveys/market research/travel/hospitality/hotel) # Industry classification., number_of_employees: str(1-10/11-50/51-200/201-500/501-2000/2001-10000/10001+) # Approximate headcount range. Used for vetting heuristics; pick the bucket that contains your current employee count., organization_legal_type: str(corporation/llc/partnership/nonprofit/other) # Legal-entity form. Pick the form that matches your incorporation documents: - `corporation` - C-corp or S-corp. - `llc` - limited liability company. - `partnership` - general/limited partnership. - `nonprofit` - non-profit corporation, charitable trust, or 501(c)(3)/equivalent. - `other` - anything else (sole proprietorships, government bodies, DBAs, etc.). You may be asked for additional documents during vetting., doing_business_as: str, jurisdiction_of_incorporation: str, organization_contact: map{first_name!: str, last_name!: str, email!: str(email), job_title!: str, phone_number!: str}, billing_contact: map{first_name!: str, last_name!: str, email!: str(email), phone_number!: str}, organization_physical_address: map{country!: str, administrative_area!: str, city!: str, postal_code!: str, street_address!: str, extended_address: str}, billing_address: map{country!: str, administrative_area!: str, city!: str, postal_code!: str, street_address!: str, extended_address: str}}\n@optional {role_type: str(enterprise/bpo)=enterprise # `enterprise` for an organization registering its own DIRs; `bpo` for a Business Process Outsourcer placing calls on behalf of one or more enterprises., customer_reference: str # Optional free-form string the caller can attach for their own bookkeeping. Telnyx does not interpret it., primary_business_domain_sic_code: str # Optional SIC code for the primary line of business., corporate_registration_number: str # Optional corporate-registration / company-number identifier., professional_license_number: str # Optional professional-license number for regulated industries., dun_bradstreet_number: str # Optional D-U-N-S Number.}\n@returns(201) {data: map{id: str(uuid), legal_name: str, organization_type: str, country_code: str, role_type: str, website: str, fein: str, industry: str, number_of_employees: str, organization_legal_type: str, doing_business_as: str, jurisdiction_of_incorporation: str, customer_reference: str, primary_business_domain_sic_code: str?, corporate_registration_number: str?, professional_license_number: str?, dun_bradstreet_number: str?, organization_contact: map{first_name: str, last_name: str, email: str(email), job_title: str, phone_number: str}, billing_contact: map{first_name: str, last_name: str, email: str(email), phone_number: str}, organization_physical_address: map{country: str, administrative_area: str, city: str, postal_code: str, street_address: str, extended_address: str?}, billing_address: map{country: str, administrative_area: str, city: str, postal_code: str, street_address: str, extended_address: str?}, created_at: str(date-time), updated_at: str(date-time), branded_calling_enabled: bool, number_reputation_enabled: bool}} # Enterprise created.\n@errors {400: An error occurred. The response carries the standard Telnyx error envelope., 401: An error occurred. The response carries the standard Telnyx error envelope., 422: An error occurred. The response carries the standard Telnyx error envelope.}\n@example_request {\"legal_name\":\"Run 065 Debug Co\",\"organization_type\":\"commercial\",\"country_code\":\"US\",\"role_type\":\"enterprise\",\"website\":\"https://run065.example.com\",\"fein\":\"12-3456789\",\"industry\":\"technology\",\"number_of_employees\":\"51-200\",\"organization_legal_type\":\"llc\",\"doing_business_as\":\"Run 065 Debug\",\"jurisdiction_of_incorporation\":\"Delaware\",\"organization_contact\":{\"first_name\":\"Sam\",\"last_name\":\"Org\",\"email\":\"org@run065.example.com\",\"job_title\":\"Compliance Lead\",\"phone_number\":\"+13125550000\"},\"billing_contact\":{\"first_name\":\"Alex\",\"last_name\":\"Bill\",\"email\":\"billing@run065.example.com\",\"phone_number\":\"+13125550001\"},\"organization_physical_address\":{\"country\":\"US\",\"administrative_area\":\"IL\",\"city\":\"Chicago\",\"postal_code\":\"60601\",\"street_address\":\"100 Main St\"},\"billing_address\":{\"country\":\"US\",\"administrative_area\":\"IL\",\"city\":\"Chicago\",\"postal_code\":\"60601\",\"street_address\":\"100 Main St\"}}\n\n@endpoint DELETE /enterprises/{enterprise_id}\n@desc Delete an enterprise\n@required {enterprise_id: str(uuid) # The enterprise id. Lowercase UUID.}\n@returns(204) 204 (no body)\n@errors {400: An error occurred. The response carries the standard Telnyx error envelope., 401: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint GET /enterprises/{enterprise_id}\n@desc Get an enterprise\n@required {enterprise_id: str(uuid) # The enterprise id. Lowercase UUID.}\n@returns(200) {data: map{id: str(uuid), legal_name: str, organization_type: str, country_code: str, role_type: str, website: str, fein: str, industry: str, number_of_employees: str, organization_legal_type: str, doing_business_as: str, jurisdiction_of_incorporation: str, customer_reference: str, primary_business_domain_sic_code: str?, corporate_registration_number: str?, professional_license_number: str?, dun_bradstreet_number: str?, organization_contact: map{first_name: str, last_name: str, email: str(email), job_title: str, phone_number: str}, billing_contact: map{first_name: str, last_name: str, email: str(email), phone_number: str}, organization_physical_address: map{country: str, administrative_area: str, city: str, postal_code: str, street_address: str, extended_address: str?}, billing_address: map{country: str, administrative_area: str, city: str, postal_code: str, street_address: str, extended_address: str?}, created_at: str(date-time), updated_at: str(date-time), branded_calling_enabled: bool, number_reputation_enabled: bool}} # Enterprise.\n@errors {401: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint PUT /enterprises/{enterprise_id}\n@desc Replace an enterprise\n@required {enterprise_id: str(uuid) # The enterprise id. Lowercase UUID.}\n@optional {legal_name: str # Legal name of the enterprise., website: str(uri), fein: str, industry: str(accounting/finance/billing/collections/business/charity/nonprofit/communications/telecom/customer service/support/delivery/shipping/logistics/education/financial/banking/government/public/healthcare/health/pharmacy/medical/insurance/legal/law/notifications/scheduling/real estate/property/retail/ecommerce/sales/marketing/software/technology/tech/media/surveys/market research/travel/hospitality/hotel), number_of_employees: str, organization_legal_type: str, doing_business_as: str, customer_reference: str, primary_business_domain_sic_code: str, corporate_registration_number: str, professional_license_number: str, dun_bradstreet_number: str, organization_contact: map{first_name!: str, last_name!: str, email!: str(email), job_title!: str, phone_number!: str}, billing_contact: map{first_name!: str, last_name!: str, email!: str(email), phone_number!: str}, organization_physical_address: map{country!: str, administrative_area!: str, city!: str, postal_code!: str, street_address!: str, extended_address: str}, billing_address: map{country!: str, administrative_area!: str, city!: str, postal_code!: str, street_address!: str, extended_address: str}, jurisdiction_of_incorporation: str # Updated state/province/country of incorporation. Optional on update.}\n@returns(200) {data: map{id: str(uuid), legal_name: str, organization_type: str, country_code: str, role_type: str, website: str, fein: str, industry: str, number_of_employees: str, organization_legal_type: str, doing_business_as: str, jurisdiction_of_incorporation: str, customer_reference: str, primary_business_domain_sic_code: str?, corporate_registration_number: str?, professional_license_number: str?, dun_bradstreet_number: str?, organization_contact: map{first_name: str, last_name: str, email: str(email), job_title: str, phone_number: str}, billing_contact: map{first_name: str, last_name: str, email: str(email), phone_number: str}, organization_physical_address: map{country: str, administrative_area: str, city: str, postal_code: str, street_address: str, extended_address: str?}, billing_address: map{country: str, administrative_area: str, city: str, postal_code: str, street_address: str, extended_address: str?}, created_at: str(date-time), updated_at: str(date-time), branded_calling_enabled: bool, number_reputation_enabled: bool}} # Enterprise updated.\n@errors {400: An error occurred. The response carries the standard Telnyx error envelope., 401: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope.}\n@example_request {\"legal_name\":\"Acme Plumbing LLC\",\"doing_business_as\":\"Acme Plumbing\",\"organization_legal_type\":\"llc\",\"industry\":\"business\",\"number_of_employees\":\"51-200\",\"jurisdiction_of_incorporation\":\"Delaware\",\"website\":\"https://acmeplumbing.example.com\",\"fein\":\"12-3456789\",\"customer_reference\":\"internal-ref-2026Q2\",\"organization_contact\":{\"first_name\":\"Sam\",\"last_name\":\"Owner\",\"email\":\"sam@acmeplumbing.example.com\",\"job_title\":\"Compliance Lead\",\"phone_number\":\"+13125550000\"},\"billing_contact\":{\"first_name\":\"Alex\",\"last_name\":\"Bill\",\"email\":\"billing@acmeplumbing.example.com\",\"phone_number\":\"+13125550001\"},\"organization_physical_address\":{\"country\":\"US\",\"administrative_area\":\"IL\",\"city\":\"Chicago\",\"postal_code\":\"60601\",\"street_address\":\"100 Main St\"},\"billing_address\":{\"country\":\"US\",\"administrative_area\":\"IL\",\"city\":\"Chicago\",\"postal_code\":\"60601\",\"street_address\":\"100 Main St\"}}\n\n@endpoint POST /enterprises/{enterprise_id}/branded_calling\n@desc Activate Branded Calling on an enterprise\n@required {enterprise_id: str(uuid) # The enterprise id. Lowercase UUID.}\n@returns(200) {data: map{id: str(uuid), legal_name: str, organization_type: str, country_code: str, role_type: str, website: str, fein: str, industry: str, number_of_employees: str, organization_legal_type: str, doing_business_as: str, jurisdiction_of_incorporation: str, customer_reference: str, primary_business_domain_sic_code: str?, corporate_registration_number: str?, professional_license_number: str?, dun_bradstreet_number: str?, organization_contact: map{first_name: str, last_name: str, email: str(email), job_title: str, phone_number: str}, billing_contact: map{first_name: str, last_name: str, email: str(email), phone_number: str}, organization_physical_address: map{country: str, administrative_area: str, city: str, postal_code: str, street_address: str, extended_address: str?}, billing_address: map{country: str, administrative_area: str, city: str, postal_code: str, street_address: str, extended_address: str?}, created_at: str(date-time), updated_at: str(date-time), branded_calling_enabled: bool, number_reputation_enabled: bool}} # Branded Calling activated.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint GET /enterprises/{enterprise_id}/dir\n@desc List DIRs in an enterprise\n@required {enterprise_id: str(uuid) # The enterprise id. Lowercase UUID.}\n@optional {page[number]: int=1: any # 1-based page number. Out-of-range values return an empty page with correct meta., page[size]: int=20 # Items per page. Maximum 250; values above are clamped to 250., sort: str(created_at/-created_at/updated_at/-updated_at/display_name/-display_name/status/-status/submitted_at/-submitted_at/verified_at/-verified_at/expiring_at/-expiring_at)=-created_at # Sort field. Allowed: `created_at`, `updated_at`, `display_name`, `status`, `submitted_at`, `verified_at`, `expiring_at`. Prefix with `-` for descending. Default `-created_at`., filter[expiring_at][gte]: str(date-time) # Return only DIRs whose `expiring_at` is at or after this ISO-8601 timestamp., filter[expiring_at][lte]: str(date-time) # Return only DIRs whose `expiring_at` is at or before this ISO-8601 timestamp., filter[expiring_within_days]: int # Convenience: returns DIRs whose `expiring_at` falls within the next N days (1–365). Equivalent to setting `filter[expiring_at][gte]=` + `filter[expiring_at][lte]=`. Mutually exclusive with the explicit `[gte]`/`[lte]` filters - combining returns 400., filter[status]: str # Filter by DIR status., filter[display_name][contains]: str # Case-insensitive partial match on display name., filter[call_reason][contains]: str # Case-insensitive partial match on call reason.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Paginated list of DIRs.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint POST /enterprises/{enterprise_id}/dir\n@desc Create a Display Identity Record (DIR)\n@required {enterprise_id: str(uuid) # The enterprise id. Lowercase UUID., display_name: str # Name shown to call recipients. No emoji; not whitespace-only., certify_brand_is_accurate: bool # Must be `true`., certify_no_shaft_content: bool # Must be `true`. Confirms this DIR is not used for SHAFT content (Sex, Hate, Alcohol, Firearms, Tobacco) where prohibited., certify_ip_ownership: bool # Must be `true`. Confirms ownership of any logos/trademarks shown., authorizer_name: str # Name of the person at your enterprise who is authorizing this DIR registration. Must be a real individual (used for audit and trademark-claim contests)., authorizer_email: str(email) # Contact email of the authorizer. Telnyx may send verification or infringement-notice email here; use a monitored mailbox., call_reasons: [str] # 1–10 reasons your business calls customers. Validate phrasing against `POST /call_reasons/validate`.}\n@optional {reselling: bool=false # Set to true if your organization places calls on behalf of other enterprises (BPO/reseller)., logo_url: str(uri) # Publicly accessible HTTPS URL (max 128 chars) to a 256x256 BMP logo (max 1 MB)., documents: [map{document_id!: str(uuid), document_type!: str, description: str}] # Supporting documents. Each `document_id` may appear at most once on a DIR.}\n@returns(201) {data: map{id: str(uuid), enterprise_id: str(uuid), display_name: str, reselling: bool, certify_brand_is_accurate: bool, certify_no_shaft_content: bool, certify_ip_ownership: bool, authorizer_name: str?, authorizer_email: str(email)?, logo_url: str(uri)?, call_reasons: [map], documents: [map]?, status: str, rejection_reasons: [map]?, rejected_at: str(date-time)?, created_at: str(date-time), updated_at: str(date-time), submitted_at: str(date-time)?, verified_at: str(date-time)?, expiring_at: str(date-time)?}} # DIR created in `draft` status.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n@example_request {\"display_name\":\"Acme Plumbing\",\"reselling\":false,\"certify_brand_is_accurate\":true,\"certify_no_shaft_content\":true,\"certify_ip_ownership\":true,\"authorizer_name\":\"Sam Owner\",\"authorizer_email\":\"sam@acmeplumbing.example.com\",\"call_reasons\":[\"Appointment reminders\",\"Billing inquiries\"]}\n\n@endpoint DELETE /enterprises/{enterprise_id}/reputation\n@desc Disable phone-number reputation for an enterprise\n@required {enterprise_id: str(uuid) # The enterprise id. Lowercase UUID.}\n@returns(204) 204 (no body)\n@errors {400: An error occurred. The response carries the standard Telnyx error envelope., 401: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint GET /enterprises/{enterprise_id}/reputation\n@desc Get phone-number reputation settings for an enterprise\n@required {enterprise_id: str(uuid) # The enterprise id. Lowercase UUID.}\n@returns(200) {data: map{enterprise_id: str(uuid), status: str, check_frequency: str, loa_document_id: str?, loa_status: str, rejection_reasons: [str]?, created_at: str(date-time), updated_at: str(date-time)}} # Reputation settings.\n@errors {401: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint POST /enterprises/{enterprise_id}/reputation\n@desc Enable phone-number reputation for an enterprise\n@required {enterprise_id: str(uuid) # The enterprise id. Lowercase UUID., loa_document_id: str # Id of the signed Letter of Authorization document, returned by the Telnyx Documents API after upload (upload via `POST /v2/documents`; see https://developers.telnyx.com/api/documents).}\n@optional {check_frequency: any=business_daily # Refresh cadence. Defaults to `business_daily` if omitted.}\n@returns(201) {data: map{enterprise_id: str(uuid), status: str, check_frequency: str, loa_document_id: str?, loa_status: str, rejection_reasons: [str]?, created_at: str(date-time), updated_at: str(date-time)}} # Reputation enabled.\n@errors {400: An error occurred. The response carries the standard Telnyx error envelope., 401: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope.}\n@example_request {\"loa_document_id\":\"2a7e8337-e803-4057-a4ae-26c40eb0bc6c\",\"check_frequency\":\"business_daily\"}\n\n@endpoint PATCH /enterprises/{enterprise_id}/reputation/frequency\n@desc Change the reputation refresh frequency\n@required {enterprise_id: str(uuid) # The enterprise id. Lowercase UUID., check_frequency: str(business_daily/daily/weekly/biweekly/monthly/never) # How often Telnyx refreshes the stored reputation data for this enterprise's registered numbers.}\n@returns(200) {data: map{enterprise_id: str(uuid), status: str, check_frequency: str, loa_document_id: str?, loa_status: str, rejection_reasons: [str]?, created_at: str(date-time), updated_at: str(date-time)}} # Frequency updated.\n@errors {400: An error occurred. The response carries the standard Telnyx error envelope., 401: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope.}\n@example_request {\"check_frequency\":\"weekly\"}\n\n@endpoint PATCH /enterprises/{enterprise_id}/reputation/loa\n@desc Replace the reputation Letter of Authorization document\n@required {enterprise_id: str(uuid) # The enterprise id. Lowercase UUID., loa_document_id: str # Id of the new signed LOA document (from the Telnyx Documents API). Changing it resets LOA approval; the new document must be approved before more numbers can be added.}\n@returns(200) {data: map{enterprise_id: str(uuid), status: str, check_frequency: str, loa_document_id: str?, loa_status: str, rejection_reasons: [str]?, created_at: str(date-time), updated_at: str(date-time)}} # Updated reputation settings.\n@errors {400: An error occurred. The response carries the standard Telnyx error envelope., 401: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope.}\n@example_request {\"loa_document_id\":\"2a7e8337-e803-4057-a4ae-26c40eb0bc6c\"}\n\n@endpoint POST /enterprises/{enterprise_id}/reputation/loa\n@desc Render a phone-number reputation Letter of Authorization\n@required {enterprise_id: str(uuid) # The enterprise id. Lowercase UUID.}\n@optional {agent: map{legal_name!: str, dba: str, street_address!: str, extended_address: str, city!: str, administrative_area!: str, postal_code!: str, country!: str, contact_name!: str, contact_title!: str, contact_email!: str(email), contact_phone!: str} # Third-party reseller / partner managing the enterprise's phone numbers. Omit when the enterprise works directly with Telnyx., signature: map{image_base64!: str, signer_name: str} # Optional signature embedded in the rendered PDF. When omitted the PDF is returned unsigned for the customer to sign and upload.}\n@returns(200) Rendered LOA PDF.\n@errors {400: An error occurred. The response carries the standard Telnyx error envelope., 401: An error occurred. The response carries the standard Telnyx error envelope., 403: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope.}\n@example_request {}\n\n@endpoint GET /enterprises/{enterprise_id}/reputation/numbers\n@desc List reputation-monitored phone numbers for an enterprise\n@required {enterprise_id: str(uuid) # The enterprise id. Lowercase UUID.}\n@optional {page[number]: int=1: any # 1-based page number. Out-of-range values return an empty page with correct meta., page[size]: int=10 # Items per page. Default 10. Maximum 250; values above are clamped to 250., filter[phone_number][contains]: str # Partial match on phone number. Must contain at least 5 digits., filter[phone_number][eq]: str # Exact phone-number match (E.164).}\n@returns(200) Paginated list of numbers with reputation data.\n@errors {401: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint POST /enterprises/{enterprise_id}/reputation/numbers\n@desc Register phone numbers for reputation monitoring\n@required {enterprise_id: str(uuid) # The enterprise id. Lowercase UUID., phone_numbers: [str] # 1–100 phone numbers in E.164 format with a leading `+`.}\n@returns(201) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Numbers registered.\n@errors {400: An error occurred. The response carries the standard Telnyx error envelope., 401: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope.}\n@example_request {\"phone_numbers\":[\"+19493253498\",\"+12134445566\"]}\n\n@endpoint POST /enterprises/{enterprise_id}/reputation/numbers/refresh\n@desc Force a reputation refresh\n@required {enterprise_id: str(uuid) # The enterprise id. Lowercase UUID., phone_numbers: [str] # Phone numbers to refresh reputation data for. 1–100 numbers per request, each in E.164 format. Reputation refreshes are subject to per-enterprise rate limits.}\n@returns(200) {data: map{results: [map], total_requested: int, total_successful: int, total_failed: int}} # Refresh completed (the call is synchronous from the customer's POV - Telnyx fans out to the reputation feed before responding).\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n@example_request {\"phone_numbers\":[\"+19493253498\"]}\n\n@endpoint DELETE /enterprises/{enterprise_id}/reputation/numbers/{phone_number}\n@desc Remove a phone number from reputation monitoring\n@required {enterprise_id: str(uuid) # The enterprise id. Lowercase UUID., phone_number: str # Phone number in E.164 format (`+1NPANXXXXXX` for US/CA). The leading `+` MUST be URL-encoded as `%2B` (e.g. `%2B19493253498`).}\n@returns(204) 204 (no body)\n@errors {401: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint GET /enterprises/{enterprise_id}/reputation/numbers/{phone_number}\n@desc Get a single reputation-monitored phone number\n@required {enterprise_id: str(uuid) # The enterprise id. Lowercase UUID., phone_number: str # Phone number in E.164 format (`+1NPANXXXXXX` for US/CA). The leading `+` MUST be URL-encoded as `%2B` (e.g. `%2B19493253498`).}\n@optional {fresh: bool=false # When true, fetches fresh reputation data (incurs API cost). When false (default), returns cached data.}\n@returns(200) {data: map{id: str(uuid), enterprise_id: str(uuid), phone_number: str, reputation_data: map{spam_risk: str?, spam_category: str?, maturity_score: int?, connection_score: int?, engagement_score: int?, sentiment_score: int?, last_refreshed_at: str(date-time)?}, created_at: str(date-time), updated_at: str(date-time)}} # Phone number with reputation data.\n@errors {401: An error occurred. The response carries the standard Telnyx error envelope., 403: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint GET /enterprises/{enterprise_id}/reputation/remediation\n@desc List reputation remediation requests for an enterprise\n@required {enterprise_id: str(uuid) # The enterprise id. Lowercase UUID.}\n@optional {page[number]: int=1: any # 1-based page number. Out-of-range values return an empty page with correct meta., page[size]: int=20 # Items per page. Maximum 250; values above are clamped to 250., filter[status]: str # Filter by customer-facing status., filter[created_at][gte]: str(date-time) # Only requests created on or after this timestamp (ISO 8601)., filter[created_at][lte]: str(date-time) # Only requests created on or before this timestamp (ISO 8601).}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Paginated list of remediation requests.\n@errors {401: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint POST /enterprises/{enterprise_id}/reputation/remediation\n@desc Submit phone numbers for reputation remediation\n@required {enterprise_id: str(uuid) # The enterprise id. Lowercase UUID., phone_numbers: [str] # Phone numbers in E.164 format. Each must belong to this enterprise. Maximum 2,000 per request., call_purpose: str # How the numbers are used (free text).}\n@optional {contact_email: str(email) # Optional contact email for this remediation request., webhook_url: str(uri) # Optional https:// URL for status notifications.}\n@returns(202) {data: map{id: str(uuid), status: str, phone_numbers_count: int, phone_numbers_submitted: int, phone_numbers_ineligible: int, call_purpose: str, contact_email: str(email)?, webhook_url: str(uri)?, created_at: str(date-time), updated_at: str(date-time), tier1_completed_at: str(date-time)?, tier2_completed_at: str(date-time)?, results: map{remediated: [str], not_flagged: [str], requires_review: [str], ineligible: [str], refused: [str]}}} # Remediation request accepted and persisted.\n@errors {400: An error occurred. The response carries the standard Telnyx error envelope., 401: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope., 409: An error occurred. The response carries the standard Telnyx error envelope., 422: An error occurred. The response carries the standard Telnyx error envelope.}\n@example_request {\"phone_numbers\":[\"+19493253498\",\"+12134445566\"],\"call_purpose\":\"Appointment reminders for our dental clinic.\",\"contact_email\":\"ops@example.com\",\"webhook_url\":\"https://example.com/webhooks/remediation\"}\n\n@endpoint GET /enterprises/{enterprise_id}/reputation/remediation/{remediation_id}\n@desc Get a reputation remediation request\n@required {enterprise_id: str(uuid) # The enterprise id. Lowercase UUID., remediation_id: str(uuid) # The remediation request id. Lowercase UUID.}\n@returns(200) {data: map{id: str(uuid), status: str, phone_numbers_count: int, phone_numbers_submitted: int, phone_numbers_ineligible: int, call_purpose: str, contact_email: str(email)?, webhook_url: str(uri)?, created_at: str(date-time), updated_at: str(date-time), tier1_completed_at: str(date-time)?, tier2_completed_at: str(date-time)?, results: map{remediated: [str], not_flagged: [str], requires_review: [str], ineligible: [str], refused: [str]}}} # The remediation request.\n@errors {401: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endgroup\n\n@group external_connections\n@endpoint GET /external_connections\n@desc List all External Connections\n@optional {filter: map # Filter parameter for external connections (deepObject style). Supports filtering by connection_name, external_sip_connection, id, created_at, and phone_number., page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {400: Bad request, 401: Unauthorized, 404: Resource not found}\n\n@endpoint POST /external_connections\n@desc Creates an External Connection\n@required {external_sip_connection: str=zoom # The service that will be consuming this connection., outbound: map{channel_limit: int, outbound_voice_profile_id: str}}\n@optional {active: bool=true # Specifies whether the connection can be used., tags: [str] # Tags associated with the connection., webhook_event_url: str(uri) # The URL where webhooks related to this connection will be sent. Must include a scheme, such as 'https'., webhook_event_failover_url: str(uri)= # The failover URL where webhooks related to this connection will be sent if sending to the primary URL fails. Must include a scheme, such as 'https'., webhook_timeout_secs: int=null # Specifies how many seconds to wait before timing out a webhook., inbound: map{outbound_voice_profile_id!: str, channel_limit: int}}\n@returns(201) {data: map{id: str, record_type: str, active: bool, credential_active: bool, external_sip_connection: str, tags: [str], webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_api_version: str, webhook_timeout_secs: int?, inbound: map{channel_limit: int}, outbound: map{channel_limit: int, outbound_voice_profile_id: str}, created_at: str, updated_at: str}} # Successful response\n@errors {422: Bad request}\n\n@endpoint GET /external_connections/log_messages\n@desc List all log messages\n@optional {filter: map # Filter parameter for log messages (deepObject style). Supports filtering by external_connection_id and telephone_number with eq/contains operations., page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {log_messages: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {401: Unauthorized, 422: Bad request}\n\n@endpoint DELETE /external_connections/log_messages/{id}\n@desc Dismiss a log message\n@required {id: str # Identifies the resource.}\n@returns(200) {success: bool} # Successful response\n@errors {401: Unauthorized, 404: Resource not found}\n\n@endpoint GET /external_connections/log_messages/{id}\n@desc Retrieve a log message\n@required {id: str # Identifies the resource.}\n@returns(200) {log_messages: [map]} # Successful response\n@errors {401: Unauthorized, 404: Resource not found}\n\n@endpoint DELETE /external_connections/{id}\n@desc Deletes an External Connection\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{id: str, record_type: str, active: bool, credential_active: bool, external_sip_connection: str, tags: [str], webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_api_version: str, webhook_timeout_secs: int?, inbound: map{channel_limit: int}, outbound: map{channel_limit: int, outbound_voice_profile_id: str}, created_at: str, updated_at: str}} # Successful response\n@errors {401: Unauthorized, 404: Resource not found, 422: Bad request}\n\n@endpoint GET /external_connections/{id}\n@desc Retrieve an External Connection\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{id: str, record_type: str, active: bool, credential_active: bool, external_sip_connection: str, tags: [str], webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_api_version: str, webhook_timeout_secs: int?, inbound: map{channel_limit: int}, outbound: map{channel_limit: int, outbound_voice_profile_id: str}, created_at: str, updated_at: str}} # Successful response\n@errors {401: Unauthorized, 404: Resource not found, 422: Bad request}\n\n@endpoint PATCH /external_connections/{id}\n@desc Update an External Connection\n@required {id: str # Identifies the resource., outbound: map{channel_limit: int, outbound_voice_profile_id!: str}}\n@optional {active: bool=true # Specifies whether the connection can be used., webhook_event_url: str(uri) # The URL where webhooks related to this connection will be sent. Must include a scheme, such as 'https'., webhook_event_failover_url: str(uri)= # The failover URL where webhooks related to this connection will be sent if sending to the primary URL fails. Must include a scheme, such as 'https'., tags: [str] # Tags associated with the connection., webhook_timeout_secs: int=null # Specifies how many seconds to wait before timing out a webhook., inbound: map{channel_limit: int}}\n@returns(200) {data: map{id: str, record_type: str, active: bool, credential_active: bool, external_sip_connection: str, tags: [str], webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_api_version: str, webhook_timeout_secs: int?, inbound: map{channel_limit: int}, outbound: map{channel_limit: int, outbound_voice_profile_id: str}, created_at: str, updated_at: str}} # Successful response\n@errors {401: Unauthorized, 404: Resource not found, 409: Conflict. Another update to this connection is still in progress. Wait and retry the request later., 422: Bad request}\n\n@endpoint GET /external_connections/{id}/civic_addresses\n@desc List all civic addresses and locations\n@required {id: str # Identifies the resource.}\n@optional {filter: map # Filter parameter for civic addresses (deepObject style). Supports filtering by country.}\n@returns(200) {data: [map]} # Successful response\n@errors {401: Unauthorized, 404: Not found, 500: Unexpected Error, 502: Bad Gateway}\n\n@endpoint GET /external_connections/{id}/civic_addresses/{address_id}\n@desc Retrieve a Civic Address\n@required {id: str # Identifies the resource., address_id: str(uuid) # Identifies a civic address or a location.}\n@returns(200) {data: map{id: str(uuid), record_type: str, city_or_town: str, city_or_town_alias: str, company_name: str, country: str, country_or_district: str, default_location_id: str(uuid), description: str, house_number: str, house_number_suffix: str, postal_or_zip_code: str, state_or_province: str, street_name: str, street_suffix: str, locations: [map]}} # Successful response\n@errors {401: Unauthorized, 404: Not found, 500: Unexpected Error, 502: Bad Gateway}\n\n@endpoint PATCH /external_connections/{id}/locations/{location_id}\n@desc Update a location's static emergency address\n@required {id: str(uuid) # The ID of the external connection, location_id: str(uuid) # The ID of the location to update, static_emergency_address_id: str(uuid) # A new static emergency address ID to update the location with}\n@returns(200) {data: map{location_id: str(uuid), static_emergency_address_id: str(uuid), accepted_address_suggestions: bool}} # Location successfully updated with no associated orders to process\n@returns(202) {data: map{location_id: str(uuid), static_emergency_address_id: str(uuid), accepted_address_suggestions: bool}} # Location update accepted; associated orders being processed\n@errors {404: Location or external connection not found, 422: Unprocessable Entity - Location already has an accepted emergency address}\n@example_request {\"static_emergency_address_id\":\"3fa85f64-5717-4562-b3fc-2c963f66afa6\"}\n\n@endpoint GET /external_connections/{id}/phone_numbers\n@desc List all phone numbers\n@required {id: str # Identifies the resource.}\n@optional {filter: map # Filter parameter for phone numbers (deepObject style). Supports filtering by phone_number, civic_address_id, and location_id with eq/contains operations., page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {401: Unauthorized, 404: Not found, 422: Bad request}\n\n@endpoint GET /external_connections/{id}/phone_numbers/{phone_number_id}\n@desc Retrieve a phone number\n@required {id: str # Identifies the resource., phone_number_id: str # A phone number's ID via the Telnyx API}\n@returns(200) {data: map{ticket_id: str(uuid), telephone_number: str, number_id: str, civic_address_id: str(uuid), location_id: str(uuid), displayed_country_code: str, acquired_capabilities: [str]}} # Successful response\n@errors {401: Unauthorized, 404: Not found}\n\n@endpoint PATCH /external_connections/{id}/phone_numbers/{phone_number_id}\n@desc Update a phone number\n@required {id: str # Identifies the resource., phone_number_id: str # A phone number's ID via the Telnyx API}\n@optional {location_id: str(uuid) # Identifies the location to assign the phone number to.}\n@returns(200) {data: map{ticket_id: str(uuid), telephone_number: str, number_id: str, civic_address_id: str(uuid), location_id: str(uuid), displayed_country_code: str, acquired_capabilities: [str]}} # Successful response\n@errors {401: Unauthorized, 404: Not found, 422: Bad request}\n@example_request {\"location_id\":\"3fa85f64-5717-4562-b3fc-2c963f66afa6\"}\n\n@endpoint GET /external_connections/{id}/releases\n@desc List all Releases\n@required {id: str # Identifies the resource.}\n@optional {filter: map # Filter parameter for releases (deepObject style). Supports filtering by status, civic_address_id, location_id, and phone_number with eq/contains operations., page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {401: Unauthorized, 404: Not found, 422: Bad request}\n\n@endpoint GET /external_connections/{id}/releases/{release_id}\n@desc Retrieve a Release request\n@required {id: str # Identifies the resource., release_id: str(uuid) # Identifies a Release request}\n@returns(200) {data: map{ticket_id: str(uuid), tenant_id: str(uuid), status: str, error_message: str, telephone_numbers: [map], created_at: str}} # Successful response\n@errors {401: Unauthorized, 404: Not found}\n\n@endpoint GET /external_connections/{id}/uploads\n@desc List all Upload requests\n@required {id: str # Identifies the resource.}\n@optional {filter: map # Filter parameter for uploads (deepObject style). Supports filtering by status, civic_address_id, location_id, and phone_number with eq/contains operations., page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {401: Unauthorized, 404: Not found, 422: Bad request}\n\n@endpoint POST /external_connections/{id}/uploads\n@desc Creates an Upload request\n@required {id: str # Identifies the resource., number_ids: [str]}\n@optional {usage: str(calling_user_assignment/first_party_app_assignment) # The use case of the upload request. NOTE: `calling_user_assignment` is not supported for toll free numbers., additional_usages: [str], location_id: str(uuid) # Identifies the location to assign all phone numbers to., civic_address_id: str(uuid) # Identifies the civic address to assign all phone numbers to.}\n@returns(202) {success: bool, ticket_id: str(uuid)} # Upload request accepted. Track progress via GET /external_connections/{id}/uploads/status, or per ticket via GET /external_connections/{id}/uploads/{ticket_id}.\n@errors {401: Unauthorized, 404: Not found, 413: Payload too large. The maximum allowed phone numbers for the numbers_ids array is 1000., 422: Unprocessable Entity, 504: Gateway Timeout}\n\n@endpoint POST /external_connections/{id}/uploads/refresh\n@desc Refresh the status of all Upload requests\n@required {id: str # Identifies the resource.}\n@returns(200) {success: bool} # Successful response\n@errors {401: Unauthorized, 404: Not found, 409: Status refresh is still in progress, please wait before calling again}\n\n@endpoint GET /external_connections/{id}/uploads/status\n@desc Get the count of pending upload requests\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{pending_numbers_count: int, pending_orders_count: int}} # Successful response\n@errors {401: Unauthorized, 404: Not found}\n\n@endpoint GET /external_connections/{id}/uploads/{ticket_id}\n@desc Retrieve an Upload request\n@required {id: str # Identifies the resource., ticket_id: str(uuid) # Identifies an Upload request}\n@returns(200) {data: map{ticket_id: str(uuid), tenant_id: str(uuid), location_id: str(uuid), status: str, available_usages: [str], error_code: str, error_message: str, tn_upload_entries: [map]}} # Successful response\n@errors {401: Unauthorized, 404: Not found}\n\n@endpoint POST /external_connections/{id}/uploads/{ticket_id}/retry\n@desc Retry an Upload request\n@required {id: str # Identifies the resource., ticket_id: str(uuid) # Identifies an Upload request}\n@returns(202) {data: map{ticket_id: str(uuid), tenant_id: str(uuid), location_id: str(uuid), status: str, available_usages: [str], error_code: str, error_message: str, tn_upload_entries: [map]}} # Retry accepted. Track the upload via GET /external_connections/{id}/uploads/{ticket_id}.\n@errors {401: Unauthorized, 404: Not found, 409: Order is still in progress, please wait before retrying, 422: Unprocessable Entity}\n\n@endgroup\n\n@group external_requirements\n@endpoint GET /external_requirements/{regulatory_requirement_id}/sub_number_orders/{sub_number_order_id}\n@desc Get action requirement details for a sub number order\n@required {regulatory_requirement_id: str(uuid) # The ID of the regulatory (action) requirement. For Australia mobile ID verification this is `b7c72fb8-fa08-4529-aaf6-b9117d3f3698`., sub_number_order_id: str(uuid) # The ID of the sub number order the requirement belongs to.}\n@returns(200) {data: map{regulatory_requirement_id: str(uuid), fields_required: [map], requirement_action: map{type: str, value: str?}}} # Action requirement details retrieved successfully.\n@errors {401: Unauthorized, 404: The requested resource doesn't exist., 500: Unexpected error}\n\n@endpoint POST /external_requirements/{regulatory_requirement_id}/sub_number_orders/{sub_number_order_id}\n@desc Fulfill an action requirement for a sub number order\n@required {regulatory_requirement_id: str(uuid) # The ID of the regulatory (action) requirement. For Australia mobile ID verification this is `b7c72fb8-fa08-4529-aaf6-b9117d3f3698`., sub_number_order_id: str(uuid) # The ID of the sub number order the requirement belongs to., requirement: map{first_name!: str, last_name!: str} # The end user's identity details for the action requirement. Australia mobile ID verification is currently the only action requirement. It requires `first_name` and `last_name`, the same fields the corresponding GET lists in `fields_required`.}\n@returns(200) {data: map{sub_order_id: str(uuid), regulatory_requirement_id: str(uuid), requirement_action: map{type: str, value: str?}}} # Action requirement submitted successfully.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n@example_request {\"requirement\":{\"first_name\":\"Jane\",\"last_name\":\"Doe\"}}\n\n@endgroup\n\n@group fax_applications\n@endpoint GET /fax_applications\n@desc List all Fax Applications\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[application_name][contains], filter[outbound_voice_profile_id], sort: str(created_at/application_name/active)=created_at # Specifies the sort order for results. By default sorting direction is ascending. To have the results sorted in descending order add the  - prefix. That is:         application_name: sorts the result by the     application_name field in ascending order.            -application_name: sorts the result by the     application_name field in descending order.      If not given, results are sorted by created_at in descending order.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: Unauthorized}\n\n@endpoint POST /fax_applications\n@desc Creates a Fax Application\n@required {application_name: str # A user-assigned name to help manage the application., webhook_event_url: str(uri) # The URL where webhooks related to this connection will be sent. Must include a scheme, such as 'https'.}\n@optional {active: bool=true # Specifies whether the connection can be used., anchorsite_override: str(Latency/Chicago, IL/Ashburn, VA/San Jose, CA/Sydney, Australia/Amsterdam, Netherlands/London, UK/Toronto, Canada/Vancouver, Canada/Frankfurt, Germany)=Latency # `Latency` directs Telnyx to route media through the site with the lowest round-trip time to the user's connection. Telnyx calculates this time using ICMP ping messages. This can be disabled by specifying a site to handle all media., webhook_event_failover_url: str(uri)= # The failover URL where webhooks related to this connection will be sent if sending to the primary URL fails. Must include a scheme, such as 'https'., webhook_timeout_secs: int=null # Specifies how many seconds to wait before timing out a webhook., tags: [str]= # Tags associated with the Fax Application., inbound: map{channel_limit: int, sip_subdomain: str, sip_subdomain_receive_settings: str}, outbound: map{channel_limit: int, outbound_voice_profile_id: str}}\n@returns(201) {data: map{id: str, record_type: str, application_name: str, active: bool, anchorsite_override: str, webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_timeout_secs: int?, tags: [str], inbound: map{channel_limit: int, sip_subdomain: str, sip_subdomain_receive_settings: str}, outbound: map{channel_limit: int, outbound_voice_profile_id: str}, created_at: str, updated_at: str}} # Successful response\n@errors {401: Unauthorized, 403: Unauthorized, 422: Unprocessable entity. The request was well-formed but contains semantic errors.}\n\n@endpoint DELETE /fax_applications/{id}\n@desc Deletes a Fax Application\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{id: str, record_type: str, application_name: str, active: bool, anchorsite_override: str, webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_timeout_secs: int?, tags: [str], inbound: map{channel_limit: int, sip_subdomain: str, sip_subdomain_receive_settings: str}, outbound: map{channel_limit: int, outbound_voice_profile_id: str}, created_at: str, updated_at: str}} # Successful response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: Unauthorized, 404: The requested resource does not exist}\n\n@endpoint GET /fax_applications/{id}\n@desc Retrieve a Fax Application\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{id: str, record_type: str, application_name: str, active: bool, anchorsite_override: str, webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_timeout_secs: int?, tags: [str], inbound: map{channel_limit: int, sip_subdomain: str, sip_subdomain_receive_settings: str}, outbound: map{channel_limit: int, outbound_voice_profile_id: str}, created_at: str, updated_at: str}} # Successful response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: Unauthorized, 404: The requested resource does not exist}\n\n@endpoint PATCH /fax_applications/{id}\n@desc Update a Fax Application\n@required {id: str # Identifies the resource., application_name: str # A user-assigned name to help manage the application., webhook_event_url: str(uri) # The URL where webhooks related to this connection will be sent. Must include a scheme, such as 'https'.}\n@optional {active: bool=true # Specifies whether the connection can be used., anchorsite_override: str(Latency/Chicago, IL/Ashburn, VA/San Jose, CA/Sydney, Australia/Amsterdam, Netherlands/London, UK/Toronto, Canada/Vancouver, Canada/Frankfurt, Germany)=Latency # `Latency` directs Telnyx to route media through the site with the lowest round-trip time to the user's connection. Telnyx calculates this time using ICMP ping messages. This can be disabled by specifying a site to handle all media., webhook_event_failover_url: str(uri)= # The failover URL where webhooks related to this connection will be sent if sending to the primary URL fails. Must include a scheme, such as 'https'., webhook_timeout_secs: int=null # Specifies how many seconds to wait before timing out a webhook., fax_email_recipient: str=null # Specifies an email address where faxes sent to this application will be forwarded to (as pdf or tiff attachments), tags: [str] # Tags associated with the Fax Application., inbound: map{channel_limit: int, sip_subdomain: str, sip_subdomain_receive_settings: str}, outbound: map{channel_limit: int, outbound_voice_profile_id: str}}\n@returns(200) {data: map{id: str, record_type: str, application_name: str, active: bool, anchorsite_override: str, webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_timeout_secs: int?, tags: [str], inbound: map{channel_limit: int, sip_subdomain: str, sip_subdomain_receive_settings: str}, outbound: map{channel_limit: int, outbound_voice_profile_id: str}, created_at: str, updated_at: str}} # Successful response\n@errors {401: Unauthorized, 403: Unauthorized, 404: The requested resource does not exist, 409: Conflict. Another update to this application is still in progress. Wait and retry the request later., 422: Unprocessable entity. The request was well-formed but contains semantic errors.}\n\n@endgroup\n\n@group faxes\n@endpoint GET /faxes\n@desc View a list of faxes\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[created_at][gte], filter[created_at][gt], filter[created_at][lte], filter[created_at][lt], filter[direction][eq], filter[from][eq], filter[to][eq], page: map # Consolidated pagination parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # List faxes response\n@errors {404: The requested resource does not exist}\n\n@endpoint POST /faxes\n@desc Send a fax\n@required {connection_id: str # The connection ID to send the fax with., to: str # The phone number, in E.164 format, the fax will be sent to or SIP URI, from: str # The phone number, in E.164 format, the fax will be sent from.}\n@optional {media_url: str # The URL (or list of URLs) to the fax document. Supported formats: PDF, TIFF, JPEG, PNG, DOC, DOCX, RTF, and TXT. media_url and media_name/contents can't be submitted together., media_name: str # The media_name used for the fax's media. Must point to a file previously uploaded to api.telnyx.com/v2/media by the same user/organization. Supported formats: PDF, TIFF, JPEG, PNG, DOC, DOCX, RTF, and TXT. media_name and media_url/contents can't be submitted together., from_display_name: str # The `from_display_name` string to be used as the caller id name (SIP From Display Name) presented to the destination (`to` number). The string should have a maximum of 128 characters, containing only letters, numbers, spaces, and -_~!.+ special characters. If ommited, the display name will be the same as the number in the `from` field., quality: str(normal/high/very_high/ultra_light/ultra_dark)=high # The quality of the fax. The `ultra` settings provides the highest quality available, but also present longer fax processing times. `ultra_light` is best suited for images, wihle `ultra_dark` is best suited for text., t38_enabled: bool=true # The flag to disable the T.38 protocol., monochrome: bool=false # The flag to enable monochrome, true black and white fax results., black_threshold: int=95 # The black threshold percentage for monochrome faxes. Only applicable if `monochrome` is set to `true`., store_media: bool=false # Should fax media be stored on temporary URL. It does not support media_name, they can't be submitted together., store_preview: bool=false # Should fax preview be stored on temporary URL., preview_format: str(pdf/tiff)=tiff # The format for the preview file in case the `store_preview` is `true`., webhook_url: str # Use this field to override the URL to which Telnyx will send subsequent webhooks for this fax., client_state: str # Use this field to add state to every subsequent webhook. It must be a valid Base-64 encoded string.}\n@returns(202) {data: map{record_type: str, id: str(uuid), connection_id: str, direction: str, media_url: str, media_name: str, to: str, from: str, from_display_name: str, quality: str, status: str, webhook_url: str, webhook_failover_url: str, store_media: bool, stored_media_url: str, preview_url: str, client_state: str, created_at: str(date-time), updated_at: str(date-time), failure_reason: str?, internal_failure_reason: str?}} # Fax queued for sending. Track its progress by polling GET /faxes/{id} with the returned fax id.\n@errors {422: Unprocessable entity. The request was well-formed but contains semantic errors.}\n\n@endpoint DELETE /faxes/{id}\n@desc Delete a fax\n@required {id: str(uuid) # The unique identifier of a fax.}\n@returns(204) The resource was deleted successfully.\n@errors {404: The requested resource does not exist}\n\n@endpoint GET /faxes/{id}\n@desc View a fax\n@required {id: str(uuid) # The unique identifier of a fax.}\n@returns(200) {data: map{record_type: str, id: str(uuid), connection_id: str, direction: str, media_url: str, media_name: str, to: str, from: str, from_display_name: str, quality: str, status: str, webhook_url: str, webhook_failover_url: str, store_media: bool, stored_media_url: str, preview_url: str, client_state: str, created_at: str(date-time), updated_at: str(date-time), failure_reason: str?, internal_failure_reason: str?}} # Get fax response\n@errors {404: The requested resource does not exist}\n\n@endpoint POST /faxes/{id}/actions/cancel\n@desc Cancel a fax\n@required {id: str(uuid) # The unique identifier of a fax.}\n@returns(202) {data: map{result: str}} # Successful response upon accepting cancel fax command\n@errors {404: The requested resource does not exist, 422: Unprocessable entity. The request was well-formed but contains semantic errors.}\n\n@endpoint POST /faxes/{id}/actions/refresh\n@desc Refresh a fax\n@required {id: str(uuid) # The unique identifier of a fax.}\n@returns(200) {data: map{result: str}} # Refresh fax response\n@errors {404: The requested resource does not exist}\n\n@endgroup\n\n@group fqdn_connections\n@endpoint GET /fqdn_connections\n@desc List FQDN connections\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[connection_name], filter[fqdn], filter[outbound_voice_profile_id], filter[outbound.outbound_voice_profile_id], page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], sort: str(created_at/connection_name/active)=created_at # Specifies the sort order for results. By default sorting direction is ascending. To have the results sorted in descending order add the  - prefix. That is:         connection_name: sorts the result by the     connection_name field in ascending order.            -connection_name: sorts the result by the     connection_name field in descending order.      If not given, results are sorted by created_at in descending order.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of FQDN connections.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist.}\n\n@endpoint POST /fqdn_connections\n@desc Create an FQDN connection\n@required {connection_name: str # A user-assigned name to help manage the connection.}\n@optional {active: bool=true # Defaults to true, anchorsite_override: str(Latency/Chicago, IL/Ashburn, VA/San Jose, CA/Sydney, Australia/Amsterdam, Netherlands/London, UK/Toronto, Canada/Vancouver, Canada/Frankfurt, Germany)=Latency # `Latency` directs Telnyx to route media through the site with the lowest round-trip time to the user's connection. Telnyx calculates this time using ICMP ping messages. This can be disabled by specifying a site to handle all media., transport_protocol: str(UDP/TCP/TLS)=UDP # One of UDP, TLS, or TCP. Applies only to connections with IP authentication or FQDN authentication., default_on_hold_comfort_noise_enabled: bool=true # When enabled, Telnyx will generate comfort noise when you place the call on hold. If disabled, you will need to generate comfort noise or on hold music to avoid RTP timeout., dtmf_type: str(RFC 2833/Inband/SIP INFO)=RFC 2833 # Sets the type of DTMF digits sent from Telnyx to this Connection. Note that DTMF digits sent to Telnyx will be accepted in all formats., encode_contact_header_enabled: bool=false # Encode the SIP contact header sent by Telnyx to avoid issues for NAT or ALG scenarios., encrypted_media: str # Enable use of SRTP for encryption. Cannot be set if the transport_portocol is TLS., microsoft_teams_sbc: bool=false # When enabled, the connection will be created for Microsoft Teams Direct Routing. A *.mstsbc.telnyx.tech FQDN will be created for the connection automatically., onnet_t38_passthrough_enabled: bool=false # Enable on-net T38 if you prefer the sender and receiver negotiating T38 directly if both are on the Telnyx network. If this is disabled, Telnyx will be able to use T38 on just one leg of the call depending on each leg's settings., tags: [str] # Tags associated with the connection., ios_push_credential_id: str=null # The uuid of the push credential for Ios, android_push_credential_id: str=null # The uuid of the push credential for Android, webhook_event_url: str(uri) # The URL where webhooks related to this connection will be sent. Must include a scheme, such as 'https'., webhook_event_failover_url: str(uri)= # The failover URL where webhooks related to this connection will be sent if sending to the primary URL fails. Must include a scheme, such as 'https'., webhook_api_version: str(1/2)=1 # Determines which webhook format will be used, Telnyx API v1 or v2., call_cost_in_webhooks: bool=false # Specifies if call cost webhooks should be sent for this connection., webhook_timeout_secs: int=null # Specifies how many seconds to wait before timing out a webhook., rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_routing_method: str, default_primary_fqdn_id: str, default_secondary_fqdn_id: str, default_tertiary_fqdn_id: str, channel_limit: int, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, sip_region: str, sip_subdomain: str, sip_subdomain_receive_settings: str, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool}, outbound: map{ani_override: str, ani_override_type: str, call_parking_enabled: bool, channel_limit: int, generate_ringback_tone: bool, instant_ringback_enabled: bool, ip_authentication_method: str, ip_authentication_token: str, localization: str, outbound_voice_profile_id: str, t38_reinvite_source: str, tech_prefix: str, encrypted_media: str, timeout_1xx_secs: int, timeout_2xx_secs: int}, noise_suppression: str(inbound/outbound/both/disabled) # Controls when noise suppression is applied to calls. When set to 'inbound', noise suppression is applied to incoming audio. When set to 'outbound', it's applied to outgoing audio. When set to 'both', it's applied in both directions. When set to 'disabled', noise suppression is turned off., noise_suppression_details: map{engine: str, attenuation_limit: int} # Configuration options for noise suppression. These settings are stored regardless of the noise_suppression value, but only take effect when noise_suppression is not 'disabled'. If you disable noise suppression and later re-enable it, the previously configured settings will be used., jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int} # Configuration options for Jitter Buffer. Enables Jitter Buffer for RTP streams of SIP Trunking calls. The feature is off unless enabled. You may define min and max values in msec for customized buffering behaviors. Larger values add latency but tolerate more jitter, while smaller values reduce latency but are more sensitive to jitter and reordering.}\n@returns(201) {data: map{id: str, record_type: str, active: bool, conversation_persistence: bool, anchorsite_override: str, connection_name: str, transport_protocol: str, default_on_hold_comfort_noise_enabled: bool, dtmf_type: str, encode_contact_header_enabled: bool, encrypted_media: str?, microsoft_teams_sbc: bool, onnet_t38_passthrough_enabled: bool, ios_push_credential_id: str?, android_push_credential_id: str?, user_name: str, password: str, rtp_pass_codecs_on_stream_change: bool, adjust_dtmf_timestamp: bool, ignore_dtmf_duration: bool, ignore_mark_bit: bool, call_cost_enabled: bool, noise_suppression: str, send_normalized_timestamps: bool, third_party_control_enabled: bool, txt_name: str, txt_value: str, txt_ttl: int, tags: [str], call_cost_in_webhooks: bool, webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_api_version: str, webhook_timeout_secs: int?, rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, created_at: str, updated_at: str, inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_routing_method: str?, default_primary_fqdn_id: str?, default_secondary_fqdn_id: str?, default_tertiary_fqdn_id: str?, channel_limit: int?, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, sip_region: str, sip_subdomain: str?, sip_subdomain_receive_settings: str, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool}, outbound: map{ani_override: str, ani_override_type: str, call_parking_enabled: bool?, channel_limit: int, generate_ringback_tone: bool, instant_ringback_enabled: bool, ip_authentication_method: str, ip_authentication_token: str, localization: str, outbound_voice_profile_id: str, t38_reinvite_source: str, tech_prefix: str, encrypted_media: str?, timeout_1xx_secs: int, timeout_2xx_secs: int}, noise_suppression_details: map{engine: str, attenuation_limit: int}, jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int}}} # Successful response with details about an FQDN connection.\n@errors {401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist., 422: The request was well-formed but was unable to be followed due to semantic errors.}\n\n@endpoint GET /fqdn_connections/{fqdn_connection_id}/fqdn_authentication\n@desc Retrieve an FQDN authentication\n@required {fqdn_connection_id: str # The ID of the FQDN connection.}\n@returns(200) {data: map{id: str, record_type: str, connection_id: str, user_name: str, password: str, ip_authentication_method: str, fqdn_outbound_authentication: str, webhook_url: str(uri), failover_url: str(uri), microsoft_teams_sbc: bool, txt_name: str, txt_value: str, txt_ttl: int}} # Successful response with details about the FQDN authentication.\n@errors {401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist.}\n\n@endpoint PATCH /fqdn_connections/{fqdn_connection_id}/fqdn_authentication\n@desc Update an FQDN authentication\n@required {fqdn_connection_id: str # The ID of the FQDN connection.}\n@optional {user_name: str # The username for authentication., password: str # The password for authentication., ip_authentication_method: str(token/p-charge-info) # The IP authentication method., fqdn_outbound_authentication: str(ip-authentication/credential-authentication) # The outbound authentication type., webhook_url: str(uri) # The webhook URL for authentication events., failover_url: str(uri) # The failover webhook URL., txt_name: str # The TXT record name for Microsoft Teams SBC DNS verification., txt_value: str # The TXT record value for Microsoft Teams SBC DNS verification., txt_ttl: int # The TTL for the TXT record.}\n@returns(200) {data: map{id: str, record_type: str, connection_id: str, user_name: str, password: str, ip_authentication_method: str, fqdn_outbound_authentication: str, webhook_url: str(uri), failover_url: str(uri), microsoft_teams_sbc: bool, txt_name: str, txt_value: str, txt_ttl: int}} # Successful response with the updated FQDN authentication.\n@errors {401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist., 409: Conflict. Another update to this connection is still in progress. Wait and retry the request later., 422: The request was well-formed but was unable to be followed due to semantic errors.}\n\n@endpoint DELETE /fqdn_connections/{id}\n@desc Delete an FQDN connection\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{id: str, record_type: str, active: bool, conversation_persistence: bool, anchorsite_override: str, connection_name: str, transport_protocol: str, default_on_hold_comfort_noise_enabled: bool, dtmf_type: str, encode_contact_header_enabled: bool, encrypted_media: str?, microsoft_teams_sbc: bool, onnet_t38_passthrough_enabled: bool, ios_push_credential_id: str?, android_push_credential_id: str?, user_name: str, password: str, rtp_pass_codecs_on_stream_change: bool, adjust_dtmf_timestamp: bool, ignore_dtmf_duration: bool, ignore_mark_bit: bool, call_cost_enabled: bool, noise_suppression: str, send_normalized_timestamps: bool, third_party_control_enabled: bool, txt_name: str, txt_value: str, txt_ttl: int, tags: [str], call_cost_in_webhooks: bool, webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_api_version: str, webhook_timeout_secs: int?, rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, created_at: str, updated_at: str, inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_routing_method: str?, default_primary_fqdn_id: str?, default_secondary_fqdn_id: str?, default_tertiary_fqdn_id: str?, channel_limit: int?, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, sip_region: str, sip_subdomain: str?, sip_subdomain_receive_settings: str, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool}, outbound: map{ani_override: str, ani_override_type: str, call_parking_enabled: bool?, channel_limit: int, generate_ringback_tone: bool, instant_ringback_enabled: bool, ip_authentication_method: str, ip_authentication_token: str, localization: str, outbound_voice_profile_id: str, t38_reinvite_source: str, tech_prefix: str, encrypted_media: str?, timeout_1xx_secs: int, timeout_2xx_secs: int}, noise_suppression_details: map{engine: str, attenuation_limit: int}, jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int}}} # Successful response with details about an FQDN connection.\n@errors {401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist., 422: The request was well-formed but was unable to be followed due to semantic errors.}\n\n@endpoint GET /fqdn_connections/{id}\n@desc Retrieve an FQDN connection\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{id: str, record_type: str, active: bool, conversation_persistence: bool, anchorsite_override: str, connection_name: str, transport_protocol: str, default_on_hold_comfort_noise_enabled: bool, dtmf_type: str, encode_contact_header_enabled: bool, encrypted_media: str?, microsoft_teams_sbc: bool, onnet_t38_passthrough_enabled: bool, ios_push_credential_id: str?, android_push_credential_id: str?, user_name: str, password: str, rtp_pass_codecs_on_stream_change: bool, adjust_dtmf_timestamp: bool, ignore_dtmf_duration: bool, ignore_mark_bit: bool, call_cost_enabled: bool, noise_suppression: str, send_normalized_timestamps: bool, third_party_control_enabled: bool, txt_name: str, txt_value: str, txt_ttl: int, tags: [str], call_cost_in_webhooks: bool, webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_api_version: str, webhook_timeout_secs: int?, rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, created_at: str, updated_at: str, inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_routing_method: str?, default_primary_fqdn_id: str?, default_secondary_fqdn_id: str?, default_tertiary_fqdn_id: str?, channel_limit: int?, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, sip_region: str, sip_subdomain: str?, sip_subdomain_receive_settings: str, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool}, outbound: map{ani_override: str, ani_override_type: str, call_parking_enabled: bool?, channel_limit: int, generate_ringback_tone: bool, instant_ringback_enabled: bool, ip_authentication_method: str, ip_authentication_token: str, localization: str, outbound_voice_profile_id: str, t38_reinvite_source: str, tech_prefix: str, encrypted_media: str?, timeout_1xx_secs: int, timeout_2xx_secs: int}, noise_suppression_details: map{engine: str, attenuation_limit: int}, jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int}}} # Successful response with details about an FQDN connection.\n@errors {401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist., 422: The request was well-formed but was unable to be followed due to semantic errors.}\n\n@endpoint PATCH /fqdn_connections/{id}\n@desc Update an FQDN connection\n@required {id: str # Identifies the resource.}\n@optional {active: bool # Defaults to true, conversation_persistence: bool # Whether conversation persistence is enabled for this connection. When enabled, calls handled by the connection are transcribed, stored, and indexed. Defaults to false., anchorsite_override: str(Latency/Chicago, IL/Ashburn, VA/San Jose, CA/Sydney, Australia/Amsterdam, Netherlands/London, UK/Toronto, Canada/Vancouver, Canada/Frankfurt, Germany)=Latency # `Latency` directs Telnyx to route media through the site with the lowest round-trip time to the user's connection. Telnyx calculates this time using ICMP ping messages. This can be disabled by specifying a site to handle all media., connection_name: str # A user-assigned name to help manage the connection., transport_protocol: str(UDP/TCP/TLS)=UDP # One of UDP, TLS, or TCP. Applies only to connections with IP authentication or FQDN authentication., default_on_hold_comfort_noise_enabled: bool=true # When enabled, Telnyx will generate comfort noise when you place the call on hold. If disabled, you will need to generate comfort noise or on hold music to avoid RTP timeout., dtmf_type: str(RFC 2833/Inband/SIP INFO)=RFC 2833 # Sets the type of DTMF digits sent from Telnyx to this Connection. Note that DTMF digits sent to Telnyx will be accepted in all formats., encode_contact_header_enabled: bool=false # Encode the SIP contact header sent by Telnyx to avoid issues for NAT or ALG scenarios., encrypted_media: str # Enable use of SRTP for encryption. Cannot be set if the transport_portocol is TLS., onnet_t38_passthrough_enabled: bool=false # Enable on-net T38 if you prefer that the sender and receiver negotiate T38 directly when both are on the Telnyx network. If this is disabled, Telnyx will be able to use T38 on just one leg of the call according to each leg's settings., tags: [str] # Tags associated with the connection., ios_push_credential_id: str=null # The uuid of the push credential for Ios, android_push_credential_id: str=null # The uuid of the push credential for Android, webhook_event_url: str(uri) # The URL where webhooks related to this connection will be sent. Must include a scheme, such as 'https'., webhook_event_failover_url: str(uri)= # The failover URL where webhooks related to this connection will be sent if sending to the primary URL fails. Must include a scheme, such as 'https'., webhook_api_version: str(1/2)=1 # Determines which webhook format will be used, Telnyx API v1 or v2., call_cost_in_webhooks: bool=false # Specifies if call cost webhooks should be sent for this connection., webhook_timeout_secs: int=null # Specifies how many seconds to wait before timing out a webhook., rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_routing_method: str, default_primary_fqdn_id: str, default_secondary_fqdn_id: str, default_tertiary_fqdn_id: str, channel_limit: int, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, sip_region: str, sip_subdomain: str, sip_subdomain_receive_settings: str, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool}, outbound: map{ani_override: str, ani_override_type: str, call_parking_enabled: bool, channel_limit: int, generate_ringback_tone: bool, instant_ringback_enabled: bool, ip_authentication_method: str, ip_authentication_token: str, localization: str, outbound_voice_profile_id: str, t38_reinvite_source: str, tech_prefix: str, encrypted_media: str, timeout_1xx_secs: int, timeout_2xx_secs: int}, noise_suppression: str(inbound/outbound/both/disabled) # Controls when noise suppression is applied to calls. When set to 'inbound', noise suppression is applied to incoming audio. When set to 'outbound', it's applied to outgoing audio. When set to 'both', it's applied in both directions. When set to 'disabled', noise suppression is turned off., noise_suppression_details: map{engine: str, attenuation_limit: int} # Configuration options for noise suppression. These settings are stored regardless of the noise_suppression value, but only take effect when noise_suppression is not 'disabled'. If you disable noise suppression and later re-enable it, the previously configured settings will be used., jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int} # Configuration options for Jitter Buffer. Enables Jitter Buffer for RTP streams of SIP Trunking calls. The feature is off unless enabled. You may define min and max values in msec for customized buffering behaviors. Larger values add latency but tolerate more jitter, while smaller values reduce latency but are more sensitive to jitter and reordering.}\n@returns(200) {data: map{id: str, record_type: str, active: bool, conversation_persistence: bool, anchorsite_override: str, connection_name: str, transport_protocol: str, default_on_hold_comfort_noise_enabled: bool, dtmf_type: str, encode_contact_header_enabled: bool, encrypted_media: str?, microsoft_teams_sbc: bool, onnet_t38_passthrough_enabled: bool, ios_push_credential_id: str?, android_push_credential_id: str?, user_name: str, password: str, rtp_pass_codecs_on_stream_change: bool, adjust_dtmf_timestamp: bool, ignore_dtmf_duration: bool, ignore_mark_bit: bool, call_cost_enabled: bool, noise_suppression: str, send_normalized_timestamps: bool, third_party_control_enabled: bool, txt_name: str, txt_value: str, txt_ttl: int, tags: [str], call_cost_in_webhooks: bool, webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_api_version: str, webhook_timeout_secs: int?, rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, created_at: str, updated_at: str, inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_routing_method: str?, default_primary_fqdn_id: str?, default_secondary_fqdn_id: str?, default_tertiary_fqdn_id: str?, channel_limit: int?, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, sip_region: str, sip_subdomain: str?, sip_subdomain_receive_settings: str, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool}, outbound: map{ani_override: str, ani_override_type: str, call_parking_enabled: bool?, channel_limit: int, generate_ringback_tone: bool, instant_ringback_enabled: bool, ip_authentication_method: str, ip_authentication_token: str, localization: str, outbound_voice_profile_id: str, t38_reinvite_source: str, tech_prefix: str, encrypted_media: str?, timeout_1xx_secs: int, timeout_2xx_secs: int}, noise_suppression_details: map{engine: str, attenuation_limit: int}, jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int}}} # Successful response with details about an FQDN connection.\n@errors {401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist., 409: Conflict. Another update to this connection is still in progress. Wait and retry the request later., 422: The request was well-formed but was unable to be followed due to semantic errors.}\n\n@endgroup\n\n@group fqdns\n@endpoint GET /fqdns\n@desc List FQDNs\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[connection_id], filter[fqdn], filter[port], filter[dns_record_type]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of FQDN connections.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized}\n\n@endpoint POST /fqdns\n@desc Create an FQDN\n@required {connection_id: str # ID of the FQDN connection to which this IP should be attached., fqdn: str # FQDN represented by this resource., dns_record_type: str # The DNS record type for the FQDN. For cases where a port is not set, the DNS record type must be 'srv'. For cases where a port is set, the DNS record type must be 'a'. If the DNS record type is 'a' and a port is not specified, 5060 will be used.}\n@optional {port: int=5060 # Port to use when connecting to this FQDN.}\n@returns(201) {data: map{id: str, record_type: str, connection_id: str, fqdn: str, port: int, dns_record_type: str, created_at: str, updated_at: str}} # Successful response with details about an FQDN connection.\n@errors {401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 422: The request was well-formed but was unable to be followed due to semantic errors.}\n\n@endpoint DELETE /fqdns/{id}\n@desc Delete an FQDN\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{id: str, record_type: str, connection_id: str, fqdn: str, port: int, dns_record_type: str, created_at: str, updated_at: str}} # Successful response with details about an FQDN connection.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist.}\n\n@endpoint GET /fqdns/{id}\n@desc Retrieve an FQDN\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{id: str, record_type: str, connection_id: str, fqdn: str, port: int, dns_record_type: str, created_at: str, updated_at: str}} # Successful response with details about an FQDN connection.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist.}\n\n@endpoint PATCH /fqdns/{id}\n@desc Update an FQDN\n@required {id: str # Identifies the resource.}\n@optional {connection_id: str # ID of the FQDN connection to which this IP should be attached., fqdn: str # FQDN represented by this resource., port: int=5060 # Port to use when connecting to this FQDN., dns_record_type: str # The DNS record type for the FQDN. For cases where a port is not set, the DNS record type must be 'srv'. For cases where a port is set, the DNS record type must be 'a'. If the DNS record type is 'a' and a port is not specified, 5060 will be used.}\n@returns(200) {data: map{id: str, record_type: str, connection_id: str, fqdn: str, port: int, dns_record_type: str, created_at: str, updated_at: str}} # Successful response with details about an FQDN connection.\n@errors {401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist., 409: Conflict. Another update to this connection is still in progress. Wait and retry the request later., 422: The request was well-formed but was unable to be followed due to semantic errors.}\n\n@endgroup\n\n@group global_ip_allowed_ports\n@endpoint GET /global_ip_allowed_ports\n@desc List all Global IP Allowed Ports\n@returns(200) {data: [any]} # Successful response\n@errors {422: Unexpected error}\n\n@endgroup\n\n@group global_ip_assignment_health\n@endpoint GET /global_ip_assignment_health\n@desc Global IP Assignment Health Check Metrics\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[global_ip_id][in], filter[global_ip_assignment_id][in]}\n@returns(200) {data: [map]} # Successful response\n@errors {422: Unexpected error}\n\n@endgroup\n\n@group global_ip_assignments\n@endpoint GET /global_ip_assignments\n@desc List all Global IP assignments\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [any], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint POST /global_ip_assignments\n@desc Create a Global IP assignment\n@returns(202) {data: any} # Assignment request accepted. Provisioning is asynchronous; poll GET /global_ip_assignments/{id} with the returned id to check status.\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint GET /global_ip_assignments/usage\n@desc Global IP Assignment Usage Metrics\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[global_ip_assignment_id][in], filter[global_ip_id][in]}\n@returns(200) {data: [map]} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint DELETE /global_ip_assignments/{id}\n@desc Delete a Global IP assignment\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint GET /global_ip_assignments/{id}\n@desc Retrieve a Global IP assignment\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint PATCH /global_ip_assignments/{id}\n@desc Update a Global IP assignment\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unexpected error}\n\n@endgroup\n\n@group global_ip_assignments_usage\n@endpoint GET /global_ip_assignments_usage\n@desc Global IP Assignment Usage Metrics\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[global_ip_assignment_id][in], filter[global_ip_id][in]}\n@returns(200) {data: [map]} # Successful response\n@errors {422: Unexpected error}\n\n@endgroup\n\n@group global_ip_health_check_types\n@endpoint GET /global_ip_health_check_types\n@desc List all Global IP Health check types\n@returns(200) {data: [any]} # Successful response\n@errors {422: Unexpected error}\n\n@endgroup\n\n@group global_ip_health_checks\n@endpoint GET /global_ip_health_checks\n@desc List all Global IP health checks\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [any], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint POST /global_ip_health_checks\n@desc Create a Global IP health check\n@returns(202) {data: any} # Creation request accepted. Provisioning is asynchronous; poll GET /global_ip_health_checks/{id} with the returned id to check status.\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint DELETE /global_ip_health_checks/{id}\n@desc Delete a Global IP health check\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint GET /global_ip_health_checks/{id}\n@desc Retrieve a Global IP health check\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unexpected error}\n\n@endgroup\n\n@group global_ip_latency\n@endpoint GET /global_ip_latency\n@desc Global IP Latency Metrics\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[global_ip_id][in]}\n@returns(200) {data: [map]} # Successful response\n@errors {422: Unexpected error}\n\n@endgroup\n\n@group global_ip_protocols\n@endpoint GET /global_ip_protocols\n@desc List all Global IP Protocols\n@returns(200) {data: [any]} # Successful response\n@errors {422: Unexpected error}\n\n@endgroup\n\n@group global_ip_usage\n@endpoint GET /global_ip_usage\n@desc Global IP Usage Metrics\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[global_ip_id][in]}\n@returns(200) {data: [map]} # Successful response\n@errors {422: Unexpected error}\n\n@endgroup\n\n@group global_ips\n@endpoint GET /global_ips\n@desc List all Global IPs\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [any], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint POST /global_ips\n@desc Create a Global IP\n@returns(202) {data: any} # Creation request accepted. Provisioning is asynchronous; poll GET /global_ips/{id} with the returned id to check status.\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint DELETE /global_ips/{id}\n@desc Delete a Global IP\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint GET /global_ips/{id}\n@desc Retrieve a Global IP\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unexpected error}\n\n@endgroup\n\n@group inbound_channels\n@endpoint GET /inbound_channels\n@desc List your voice channels for US Zone\n@returns(200) {data: map{channels: int, record_type: str}} # voice channels Response\n@errors {401: Unauthorized, 404: Resource not found, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint PATCH /inbound_channels\n@desc Update voice channels for US Zone\n@required {channels: int # The new number of concurrent channels for the account}\n@returns(200) {data: map{channels: int, record_type: str}} # Expected Update response\n@errors {400: Bad request, 401: Unauthorized, 404: Resource not found}\n\n@endgroup\n\n@group inexplicit_number_orders\n@endpoint GET /inexplicit_number_orders\n@desc List inexplicit number orders\n@optional {page_number: int=1 # The page number to load, page_size: int=20 # The size of the page}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of inexplicit number orders.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint POST /inexplicit_number_orders\n@desc Create an inexplicit number order\n@required {ordering_groups: [map{country_iso!: str, count_requested!: str, phone_number_type!: str, national_destination_code: str, phone_number: map, administrative_area: str, locality: str, features: [str], strategy: str, quickship: bool, exclude_held_numbers: bool}] # Group(s) of numbers to order. You can have multiple ordering_groups objects added to a single request.}\n@optional {connection_id: str # Connection id to apply to phone numbers that are purchased, messaging_profile_id: str # Messaging profile id to apply to phone numbers that are purchased, customer_reference: str # Reference label for the customer, billing_group_id: str # Billing group id to apply to phone numbers that are purchased}\n@returns(200) {data: map{id: str, connection_id: str, messaging_profile_id: str, customer_reference: str, billing_group_id: str, ordering_groups: [map], created_at: str(date-time), updated_at: str(date-time)}} # Successful response with details about an inexplicit number order.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n@example_request {\"ordering_groups\":[{\"country_iso\":\"US\",\"count_requested\":\"5\",\"phone_number_type\":\"local\",\"administrative_area\":\"CA\",\"features\":[\"voice\"]}]}\n\n@endpoint GET /inexplicit_number_orders/{id}\n@desc Retrieve an inexplicit number order\n@required {id: str(uuid) # Identifies the inexplicit number order}\n@returns(200) {data: map{id: str, connection_id: str, messaging_profile_id: str, customer_reference: str, billing_group_id: str, ordering_groups: [map], created_at: str(date-time), updated_at: str(date-time)}} # Successful response with details about an inexplicit number order.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group infringement_claims\n@endpoint GET /infringement_claims/{claim_id}\n@desc Get an infringement claim\n@required {claim_id: str(uuid) # Claim id (lowercase UUID).}\n@returns(200) {data: map{id: str(uuid), dir_id: str(uuid), enterprise_id: str(uuid), claim_type: str, claim_description: str, claimant_name: str, claimant_contact: str, claim_date: str(date-time), status: str, resolution: str?, resolution_date: str(date-time)?, resolution_notes: str?, contest_documents: [map], contest_history: [map], dir: map{id: str(uuid), display_name: str, enterprise_id: str(uuid), status: str}, created_at: str(date-time), updated_at: str(date-time)}} # Claim.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint POST /infringement_claims/{claim_id}/contest\n@desc Contest an infringement claim\n@required {claim_id: str(uuid) # Unique identifier of the claim., contest_notes: str # Customer's response to the claim. 10–2000 characters.}\n@optional {documents: [map{document_id!: str(uuid), document_type!: str, description: str}] # Up to 20 supporting documents per submission. `document_id` must be unique within this submission. Documents are aggregated into the claim's `contest_documents` across all submissions.}\n@returns(200) {data: map{id: str(uuid), dir_id: str(uuid), enterprise_id: str(uuid), claim_type: str, claim_description: str, claimant_name: str, claimant_contact: str, claim_date: str(date-time), status: str, resolution: str?, resolution_date: str(date-time)?, resolution_notes: str?, contest_documents: [map], contest_history: [map], dir: map{id: str(uuid), display_name: str, enterprise_id: str(uuid), status: str}, created_at: str(date-time), updated_at: str(date-time)}} # Updated claim, status `contested`.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n@example_request {\"contest_notes\":\"We own the trademark outright; our registration precedes the claimant by three years. See attached certificate.\",\"documents\":[{\"document_id\":\"2a7e8337-e803-4057-a4ae-26c40eb0bc6c\",\"document_type\":\"trademark_registration\",\"description\":\"USPTO trademark certificate.\"}]}\n\n@endgroup\n\n@group integration_secrets\n@endpoint GET /integration_secrets\n@desc List integration secrets\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[type]}\n@returns(200) {data: [map], meta: map{page_size: int, page_number: int, total_pages: int, total_results: int}} # Successful Response\n@errors {400: Bad Request}\n\n@endpoint POST /integration_secrets\n@desc Create a secret\n@required {identifier: str # The unique identifier of the secret., type: str(bearer/basic) # The type of secret.}\n@optional {token: str # The token for the secret. Required for bearer type secrets, ignored otherwise., username: str # The username for the secret. Required for basic type secrets, ignored otherwise., password: str # The password for the secret. Required for basic type secrets, ignored otherwise.}\n@returns(201) {data: map{record_type: str, id: str, identifier: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful Response\n@errors {422: Validation Error}\n@example_request {\"identifier\":\"my_secret\",\"type\":\"bearer\",\"token\":\"my_secret_value\"}\n\n@endpoint DELETE /integration_secrets/{id}\n@desc Delete an integration secret\n@required {id: str # Unique identifier of the resource.}\n@returns(204) The resource was deleted successfully.\n@errors {404: Secret Not found}\n\n@endgroup\n\n@group inventory_coverage\n@endpoint GET /inventory_coverage\n@desc Create an inventory coverage request\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[npa], filter[nxx], filter[administrative_area], filter[phone_number_type], filter[country_code], filter[count], filter[features], filter[groupBy]}\n@returns(200) {data: [map], meta: map{total_results: int}} # Successful response with a list of inventory coverage levels\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group invoices\n@endpoint GET /invoices\n@desc List invoices\n@optional {sort: str(period_start/-period_start) # Specifies the sort order for results., page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {meta: map{total_results: int, total_pages: int, page_number: int, page_size: int}, data: [map]} # List of invoices\n@errors {403: Insufficient permissions to access invoices}\n\n@endpoint GET /invoices/{id}\n@desc Get invoice by ID\n@required {id: str(uuid) # Invoice UUID}\n@optional {action: str(json/link) # Invoice action}\n@returns(200) {data: map{invoice_id: str(uuid), file_id: str(uuid), period_start: str(date), period_end: str(date), paid: bool, url: str(uri), download_url: str(uri)}} # Get invoice details\n@errors {400: Invalid request parameters, 403: Insufficient permissions to access invoices, 404: Invoice not found}\n\n@endgroup\n\n@group ip_connections\n@endpoint GET /ip_connections\n@desc List Ip connections\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[connection_name], filter[fqdn], filter[outbound_voice_profile_id], filter[outbound.outbound_voice_profile_id], page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], sort: str(created_at/connection_name/active)=created_at # Specifies the sort order for results. By default sorting direction is ascending. To have the results sorted in descending order add the  - prefix. That is:         connection_name: sorts the result by the     connection_name field in ascending order.            -connection_name: sorts the result by the     connection_name field in descending order.      If not given, results are sorted by created_at in descending order.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of IP connections.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action.}\n\n@endpoint POST /ip_connections\n@desc Create an Ip connection\n@optional {active: bool # Defaults to true, anchorsite_override: str(Latency/Chicago, IL/Ashburn, VA/San Jose, CA/Sydney, Australia/Amsterdam, Netherlands/London, UK/Toronto, Canada/Vancouver, Canada/Frankfurt, Germany)=Latency # `Latency` directs Telnyx to route media through the site with the lowest round-trip time to the user's connection. Telnyx calculates this time using ICMP ping messages. This can be disabled by specifying a site to handle all media., connection_name: str, transport_protocol: str(UDP/TCP/TLS)=UDP # One of UDP, TLS, or TCP. Applies only to connections with IP authentication or FQDN authentication., default_on_hold_comfort_noise_enabled: bool=true # When enabled, Telnyx will generate comfort noise when you place the call on hold. If disabled, you will need to generate comfort noise or on hold music to avoid RTP timeout., dtmf_type: str(RFC 2833/Inband/SIP INFO)=RFC 2833 # Sets the type of DTMF digits sent from Telnyx to this Connection. Note that DTMF digits sent to Telnyx will be accepted in all formats., encode_contact_header_enabled: bool=false # Encode the SIP contact header sent by Telnyx to avoid issues for NAT or ALG scenarios., encrypted_media: str # Enable use of SRTP for encryption. Cannot be set if the transport_portocol is TLS., onnet_t38_passthrough_enabled: bool=false # Enable on-net T38 if you prefer the sender and receiver negotiating T38 directly if both are on the Telnyx network. If this is disabled, Telnyx will be able to use T38 on just one leg of the call depending on each leg's settings., ios_push_credential_id: str=null # The uuid of the push credential for Ios, android_push_credential_id: str=null # The uuid of the push credential for Android, webhook_event_url: str(uri) # The URL where webhooks related to this connection will be sent. Must include a scheme, such as 'https'., webhook_event_failover_url: str(uri)= # The failover URL where webhooks related to this connection will be sent if sending to the primary URL fails. Must include a scheme, such as 'https'., webhook_api_version: str(1/2)=1 # Determines which webhook format will be used, Telnyx API v1 or v2., webhook_timeout_secs: int=null # Specifies how many seconds to wait before timing out a webhook., call_cost_in_webhooks: bool=false # Specifies if call cost webhooks should be sent for this connection., tags: [str] # Tags associated with the connection., rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_routing_method: str, channel_limit: int, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, sip_region: str, sip_subdomain: str, sip_subdomain_receive_settings: str, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool}, outbound: map{call_parking_enabled: bool, ani_override: str, ani_override_type: str, channel_limit: int, instant_ringback_enabled: bool, generate_ringback_tone: bool, localization: str, t38_reinvite_source: str, tech_prefix: str, ip_authentication_method: str, ip_authentication_token: str, outbound_voice_profile_id: str}, noise_suppression: str(inbound/outbound/both/disabled) # Controls when noise suppression is applied to calls. When set to 'inbound', noise suppression is applied to incoming audio. When set to 'outbound', it's applied to outgoing audio. When set to 'both', it's applied in both directions. When set to 'disabled', noise suppression is turned off., noise_suppression_details: map{engine: str, attenuation_limit: int} # Configuration options for noise suppression. These settings are stored regardless of the noise_suppression value, but only take effect when noise_suppression is not 'disabled'. If you disable noise suppression and later re-enable it, the previously configured settings will be used., jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int} # Configuration options for Jitter Buffer. Enables Jitter Buffer for RTP streams of SIP Trunking calls. The feature is off unless enabled. You may define min and max values in msec for customized buffering behaviors. Larger values add latency but tolerate more jitter, while smaller values reduce latency but are more sensitive to jitter and reordering.}\n@returns(201) {data: map{id: str, record_type: str, active: bool, conversation_persistence: bool, anchorsite_override: str, connection_name: str, transport_protocol: str, default_on_hold_comfort_noise_enabled: bool, dtmf_type: str, encode_contact_header_enabled: bool, encrypted_media: str?, onnet_t38_passthrough_enabled: bool, ios_push_credential_id: str?, android_push_credential_id: str?, webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_api_version: str, webhook_timeout_secs: int?, call_cost_in_webhooks: bool, rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, created_at: str, updated_at: str, tags: [str], inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_primary_ip_id: str, default_secondary_ip_id: str, default_tertiary_ip_id: str, default_routing_method: str, channel_limit: int, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, sip_region: str, sip_subdomain: str, sip_subdomain_receive_settings: str, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool}, outbound: map{call_parking_enabled: bool?, ani_override: str, ani_override_type: str, channel_limit: int, instant_ringback_enabled: bool, generate_ringback_tone: bool, localization: str, t38_reinvite_source: str, tech_prefix: str, ip_authentication_method: str, ip_authentication_token: str, outbound_voice_profile_id: str}, noise_suppression: str, noise_suppression_details: map{engine: str, attenuation_limit: int}, jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int}}} # Successful response with details about an IP connection.\n@errors {401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 422: The request was well-formed but was unable to be followed due to semantic errors.}\n\n@endpoint DELETE /ip_connections/{id}\n@desc Delete an Ip connection\n@required {id: str # Identifies the type of resource.}\n@returns(200) {data: map{id: str, record_type: str, active: bool, conversation_persistence: bool, anchorsite_override: str, connection_name: str, transport_protocol: str, default_on_hold_comfort_noise_enabled: bool, dtmf_type: str, encode_contact_header_enabled: bool, encrypted_media: str?, onnet_t38_passthrough_enabled: bool, ios_push_credential_id: str?, android_push_credential_id: str?, webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_api_version: str, webhook_timeout_secs: int?, call_cost_in_webhooks: bool, rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, created_at: str, updated_at: str, tags: [str], inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_primary_ip_id: str, default_secondary_ip_id: str, default_tertiary_ip_id: str, default_routing_method: str, channel_limit: int, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, sip_region: str, sip_subdomain: str, sip_subdomain_receive_settings: str, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool}, outbound: map{call_parking_enabled: bool?, ani_override: str, ani_override_type: str, channel_limit: int, instant_ringback_enabled: bool, generate_ringback_tone: bool, localization: str, t38_reinvite_source: str, tech_prefix: str, ip_authentication_method: str, ip_authentication_token: str, outbound_voice_profile_id: str}, noise_suppression: str, noise_suppression_details: map{engine: str, attenuation_limit: int}, jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int}}} # Successful response with details about an IP connection.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist.}\n\n@endpoint GET /ip_connections/{id}\n@desc Retrieve an Ip connection\n@required {id: str # IP Connection ID}\n@returns(200) {data: map{id: str, record_type: str, active: bool, conversation_persistence: bool, anchorsite_override: str, connection_name: str, transport_protocol: str, default_on_hold_comfort_noise_enabled: bool, dtmf_type: str, encode_contact_header_enabled: bool, encrypted_media: str?, onnet_t38_passthrough_enabled: bool, ios_push_credential_id: str?, android_push_credential_id: str?, webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_api_version: str, webhook_timeout_secs: int?, call_cost_in_webhooks: bool, rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, created_at: str, updated_at: str, tags: [str], inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_primary_ip_id: str, default_secondary_ip_id: str, default_tertiary_ip_id: str, default_routing_method: str, channel_limit: int, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, sip_region: str, sip_subdomain: str, sip_subdomain_receive_settings: str, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool}, outbound: map{call_parking_enabled: bool?, ani_override: str, ani_override_type: str, channel_limit: int, instant_ringback_enabled: bool, generate_ringback_tone: bool, localization: str, t38_reinvite_source: str, tech_prefix: str, ip_authentication_method: str, ip_authentication_token: str, outbound_voice_profile_id: str}, noise_suppression: str, noise_suppression_details: map{engine: str, attenuation_limit: int}, jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int}}} # Successful response with details about an IP connection.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist.}\n\n@endpoint PATCH /ip_connections/{id}\n@desc Update an Ip connection\n@required {id: str # Identifies the type of resource.}\n@optional {active: bool # Defaults to true, conversation_persistence: bool # Whether conversation persistence is enabled for this connection. When enabled, calls handled by the connection are transcribed, stored, and indexed. Defaults to false., anchorsite_override: str(Latency/Chicago, IL/Ashburn, VA/San Jose, CA/Sydney, Australia/Amsterdam, Netherlands/London, UK/Toronto, Canada/Vancouver, Canada/Frankfurt, Germany)=Latency # `Latency` directs Telnyx to route media through the site with the lowest round-trip time to the user's connection. Telnyx calculates this time using ICMP ping messages. This can be disabled by specifying a site to handle all media., connection_name: str, transport_protocol: str(UDP/TCP/TLS)=UDP # One of UDP, TLS, or TCP. Applies only to connections with IP authentication or FQDN authentication., default_on_hold_comfort_noise_enabled: bool=true # When enabled, Telnyx will generate comfort noise when you place the call on hold. If disabled, you will need to generate comfort noise or on hold music to avoid RTP timeout., dtmf_type: str(RFC 2833/Inband/SIP INFO)=RFC 2833 # Sets the type of DTMF digits sent from Telnyx to this Connection. Note that DTMF digits sent to Telnyx will be accepted in all formats., encode_contact_header_enabled: bool=false # Encode the SIP contact header sent by Telnyx to avoid issues for NAT or ALG scenarios., encrypted_media: str # Enable use of SRTP for encryption. Cannot be set if the transport_portocol is TLS., onnet_t38_passthrough_enabled: bool=false # Enable on-net T38 if you prefer the sender and receiver negotiating T38 directly if both are on the Telnyx network. If this is disabled, Telnyx will be able to use T38 on just one leg of the call depending on each leg's settings., ios_push_credential_id: str=null # The uuid of the push credential for Ios, android_push_credential_id: str=null # The uuid of the push credential for Android, webhook_event_url: str(uri) # The URL where webhooks related to this connection will be sent. Must include a scheme, such as 'https'., webhook_event_failover_url: str(uri)= # The failover URL where webhooks related to this connection will be sent if sending to the primary URL fails. Must include a scheme, such as 'https'., webhook_api_version: str(1/2)=1 # Determines which webhook format will be used, Telnyx API v1 or v2., webhook_timeout_secs: int=null # Specifies how many seconds to wait before timing out a webhook., call_cost_in_webhooks: bool=false # Specifies if call cost webhooks should be sent for this connection., tags: [str] # Tags associated with the connection., rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_primary_ip_id: str, default_secondary_ip_id: str, default_tertiary_ip_id: str, default_routing_method: str, channel_limit: int, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, sip_region: str, sip_subdomain: str, sip_subdomain_receive_settings: str, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool}, outbound: map{call_parking_enabled: bool, ani_override: str, ani_override_type: str, channel_limit: int, instant_ringback_enabled: bool, generate_ringback_tone: bool, localization: str, t38_reinvite_source: str, tech_prefix: str, ip_authentication_method: str, ip_authentication_token: str, outbound_voice_profile_id: str}, noise_suppression: str(inbound/outbound/both/disabled) # Controls when noise suppression is applied to calls. When set to 'inbound', noise suppression is applied to incoming audio. When set to 'outbound', it's applied to outgoing audio. When set to 'both', it's applied in both directions. When set to 'disabled', noise suppression is turned off., noise_suppression_details: map{engine: str, attenuation_limit: int} # Configuration options for noise suppression. These settings are stored regardless of the noise_suppression value, but only take effect when noise_suppression is not 'disabled'. If you disable noise suppression and later re-enable it, the previously configured settings will be used., jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int} # Configuration options for Jitter Buffer. Enables Jitter Buffer for RTP streams of SIP Trunking calls. The feature is off unless enabled. You may define min and max values in msec for customized buffering behaviors. Larger values add latency but tolerate more jitter, while smaller values reduce latency but are more sensitive to jitter and reordering.}\n@returns(200) {data: map{id: str, record_type: str, active: bool, conversation_persistence: bool, anchorsite_override: str, connection_name: str, transport_protocol: str, default_on_hold_comfort_noise_enabled: bool, dtmf_type: str, encode_contact_header_enabled: bool, encrypted_media: str?, onnet_t38_passthrough_enabled: bool, ios_push_credential_id: str?, android_push_credential_id: str?, webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_api_version: str, webhook_timeout_secs: int?, call_cost_in_webhooks: bool, rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, created_at: str, updated_at: str, tags: [str], inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_primary_ip_id: str, default_secondary_ip_id: str, default_tertiary_ip_id: str, default_routing_method: str, channel_limit: int, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, sip_region: str, sip_subdomain: str, sip_subdomain_receive_settings: str, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool}, outbound: map{call_parking_enabled: bool?, ani_override: str, ani_override_type: str, channel_limit: int, instant_ringback_enabled: bool, generate_ringback_tone: bool, localization: str, t38_reinvite_source: str, tech_prefix: str, ip_authentication_method: str, ip_authentication_token: str, outbound_voice_profile_id: str}, noise_suppression: str, noise_suppression_details: map{engine: str, attenuation_limit: int}, jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int}}} # Successful response with details about an IP connection.\n@errors {401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist., 409: Conflict. Another update to this connection is still in progress. Wait and retry the request later., 422: The request was well-formed but was unable to be followed due to semantic errors.}\n\n@endgroup\n\n@group ips\n@endpoint GET /ips\n@desc List Ips\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[connection_id], filter[ip_address], filter[port]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of IPs.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action.}\n\n@endpoint POST /ips\n@desc Create an Ip\n@required {ip_address: str # IP adddress represented by this resource.}\n@optional {connection_id: str # ID of the IP Connection to which this IP should be attached., port: int=5060 # Port to use when connecting to this IP.}\n@returns(201) {data: map{id: str, record_type: str, connection_id: str, ip_address: str, port: int, created_at: str, updated_at: str}} # Successful response with details about an IP.\n@errors {401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 422: The request was well-formed but was unable to be followed due to semantic errors.}\n\n@endpoint DELETE /ips/{id}\n@desc Delete an Ip\n@required {id: str(uuid) # Identifies the type of resource.}\n@returns(200) {data: map{id: str, record_type: str, connection_id: str, ip_address: str, port: int, created_at: str, updated_at: str}} # Successful response with details about an IP.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist.}\n\n@endpoint GET /ips/{id}\n@desc Retrieve an Ip\n@required {id: str(uuid) # Identifies the type of resource.}\n@returns(200) {data: map{id: str, record_type: str, connection_id: str, ip_address: str, port: int, created_at: str, updated_at: str}} # Successful response with details about an IP.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist.}\n\n@endpoint PATCH /ips/{id}\n@desc Update an Ip\n@required {id: str(uuid) # Identifies the type of resource., ip_address: str # IP adddress represented by this resource.}\n@optional {connection_id: str # ID of the IP Connection to which this IP should be attached., port: int=5060 # Port to use when connecting to this IP.}\n@returns(200) {data: map{id: str, record_type: str, connection_id: str, ip_address: str, port: int, created_at: str, updated_at: str}} # Successful response with details about an IP.\n@errors {401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist., 409: Conflict. Another update to this connection is still in progress. Wait and retry the request later., 422: The request was well-formed but was unable to be followed due to semantic errors.}\n\n@endgroup\n\n@group ledger_billing_group_reports\n@endpoint POST /ledger_billing_group_reports\n@desc Create a ledger billing group report\n@optional {year: int # Year of the ledger billing group report, month: int # Month of the ledger billing group report}\n@returns(200) {data: map{record_type: str, id: str(uuid), organization_id: str(uuid), status: str, report_url: str(uri)?, created_at: str(date-time), updated_at: str(date-time)}} # Expected ledger billing group report response to a valid request\n@errors {401: Unexpected error, 500: Unexpected error}\n@example_request {\"year\":2019,\"month\":10}\n\n@endpoint GET /ledger_billing_group_reports/{id}\n@desc Get a ledger billing group report\n@required {id: str(uuid) # The id of the ledger billing group report}\n@returns(200) {data: map{record_type: str, id: str(uuid), organization_id: str(uuid), status: str, report_url: str(uri)?, created_at: str(date-time), updated_at: str(date-time)}} # Expected ledger billing group report response to a valid request\n@errors {401: Unexpected error, 500: Unexpected error}\n\n@endgroup\n\n@group legacy\n@endpoint GET /legacy/reporting/batch/detail/records/speech/to/text\n@desc Get all Speech to Text batch report requests\n@returns(200) {data: [map]} # Speech to text batch report requests retrieved successfully\n@errors {401: Unauthorized, 403: Forbidden, 500: Internal server error}\n\n@endpoint POST /legacy/reporting/batch/detail/records/speech/to/text\n@desc Create a new Speech to Text batch report request\n@required {start_date: str(date-time) # Start date in ISO format with timezone, end_date: str(date-time) # End date in ISO format with timezone (date range must be up to one month)}\n@returns(200) {data: map{id: str, created_at: str(date-time), start_date: str(date-time), end_date: str(date-time), download_link: str, status: str, record_type: str}} # Speech to text batch report request created successfully\n@errors {400: Invalid request parameters, 401: Unauthorized, 403: Forbidden, 500: Internal server error}\n\n@endpoint DELETE /legacy/reporting/batch/detail/records/speech/to/text/{id}\n@desc Delete a Speech to Text batch report request\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {data: map{id: str, created_at: str(date-time), start_date: str(date-time), end_date: str(date-time), download_link: str, status: str, record_type: str}} # Speech to text batch report request deleted successfully\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endpoint GET /legacy/reporting/batch/detail/records/speech/to/text/{id}\n@desc Get a specific Speech to Text batch report request\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {data: map{id: str, created_at: str(date-time), start_date: str(date-time), end_date: str(date-time), download_link: str, status: str, record_type: str}} # Speech to text batch report request retrieved successfully\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endpoint GET /legacy/reporting/batch_detail_records/messaging\n@desc Get all MDR detailed report requests\n@returns(200) {data: [map], meta: map{total_pages: int(int32), total_results: int(int32), page_number: int(int32), page_size: int(int32)}} # MDR detailed report requests retrieved successfully\n@errors {401: Unauthorized, 403: Forbidden, 500: Internal server error}\n\n@endpoint POST /legacy/reporting/batch_detail_records/messaging\n@desc Create a new MDR detailed report request\n@required {start_time: str(date-time) # Start time in ISO format, end_time: str(date-time) # End time in ISO format. Note: If end time includes the last 4 hours, some MDRs might not appear in this report, due to wait time for downstream message delivery confirmation}\n@optional {timezone: str # Timezone for the report, directions: [int(int32)] # List of directions to filter by (Inbound = 1, Outbound = 2), record_types: [int(int32)] # List of record types to filter by (Complete = 1, Incomplete = 2, Errors = 3), connections: [int(int64)] # List of connections to filter by, report_name: str # Name of the report, include_message_body: bool # Whether to include message body in the report, filters: [map{filter_type: str, cli: str, cli_filter: str, cld: str, cld_filter: str, tags_list: str, billing_group: str}] # List of filters to apply, profiles: [str(uuid)] # List of messaging profile IDs to filter by, managed_accounts: [str(uuid)] # List of managed accounts to include, select_all_managed_accounts: bool # Whether to select all managed accounts}\n@returns(200) {data: map{id: str(uuid), start_date: str(date-time), end_date: str(date-time), directions: [str], record_types: [str], connections: [int(int64)], report_name: str, status: str, report_url: str, filters: [map], created_at: str(date-time), updated_at: str(date-time), profiles: [str(uuid)], record_type: str}} # MDR detailed report request created successfully\n@errors {400: Invalid request parameters, 401: Unauthorized, 403: Forbidden, 500: Internal server error}\n\n@endpoint DELETE /legacy/reporting/batch_detail_records/messaging/{id}\n@desc Delete a MDR detailed report request\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {data: map{id: str(uuid), start_date: str(date-time), end_date: str(date-time), directions: [str], record_types: [str], connections: [int(int64)], report_name: str, status: str, report_url: str, filters: [map], created_at: str(date-time), updated_at: str(date-time), profiles: [str(uuid)], record_type: str}} # MDR detailed report request deleted successfully\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endpoint GET /legacy/reporting/batch_detail_records/messaging/{id}\n@desc Get a specific MDR detailed report request\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {data: map{id: str(uuid), start_date: str(date-time), end_date: str(date-time), directions: [str], record_types: [str], connections: [int(int64)], report_name: str, status: str, report_url: str, filters: [map], created_at: str(date-time), updated_at: str(date-time), profiles: [str(uuid)], record_type: str}} # MDR detailed report request retrieved successfully\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endpoint GET /legacy/reporting/batch_detail_records/speech_to_text\n@desc Get all Speech to Text batch report requests\n@returns(200) {data: [map]} # Speech to text batch report requests retrieved successfully\n@errors {401: Unauthorized, 403: Forbidden, 500: Internal server error}\n\n@endpoint POST /legacy/reporting/batch_detail_records/speech_to_text\n@desc Create a new Speech to Text batch report request\n@required {start_date: str(date-time) # Start date in ISO format with timezone, end_date: str(date-time) # End date in ISO format with timezone (date range must be up to one month)}\n@returns(200) {data: map{id: str, created_at: str(date-time), start_date: str(date-time), end_date: str(date-time), download_link: str, status: str, record_type: str}} # Speech to text batch report request created successfully\n@errors {400: Invalid request parameters, 401: Unauthorized, 403: Forbidden, 500: Internal server error}\n\n@endpoint DELETE /legacy/reporting/batch_detail_records/speech_to_text/{id}\n@desc Delete a Speech to Text batch report request\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {data: map{id: str, created_at: str(date-time), start_date: str(date-time), end_date: str(date-time), download_link: str, status: str, record_type: str}} # Speech to text batch report request deleted successfully\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endpoint GET /legacy/reporting/batch_detail_records/speech_to_text/{id}\n@desc Get a specific Speech to Text batch report request\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {data: map{id: str, created_at: str(date-time), start_date: str(date-time), end_date: str(date-time), download_link: str, status: str, record_type: str}} # Speech to text batch report request retrieved successfully\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endpoint GET /legacy/reporting/batch_detail_records/voice\n@desc Get all CDR report requests\n@returns(200) {data: [map], meta: map{total_pages: int(int32), total_results: int(int32), page_number: int(int32), page_size: int(int32)}} # CDR report requests retrieved successfully\n@errors {401: Unauthorized, 403: Forbidden, 500: Internal server error}\n\n@endpoint POST /legacy/reporting/batch_detail_records/voice\n@desc Create a new CDR report request\n@required {start_time: str(date-time) # Start time in ISO format, end_time: str(date-time) # End time in ISO format}\n@optional {timezone: str # Timezone for the report, call_types: [int(int32)] # List of call types to filter by (Inbound = 1, Outbound = 2), record_types: [int(int32)] # List of record types to filter by (Complete = 1, Incomplete = 2, Errors = 3), connections: [int(int64)] # List of connections to filter by, report_name: str # Name of the report, source: str # Source of the report. Valid values: calls (default), call-control, fax-api, webrtc, include_all_metadata: bool # Whether to include all metadata, filters: [map{filter_type: str, cli: str, cli_filter: str, cld: str, cld_filter: str, tags_list: str, billing_group: str}] # List of filters to apply, fields: [str] # Set of fields to include in the report, managed_accounts: [str(uuid)] # List of managed accounts to include, select_all_managed_accounts: bool # Whether to select all managed accounts}\n@returns(200) {data: map{id: str, start_time: str, end_time: str, call_types: [int(int32)], record_types: [int(int32)], connections: [int(int64)], report_name: str, status: int(int32), report_url: str, filters: [map], created_at: str, updated_at: str, timezone: str, source: str, retry: int(int32), managed_accounts: [str(uuid)], record_type: str}} # CDR report request created successfully\n@errors {400: Invalid request parameters, 401: Unauthorized, 403: Forbidden, 500: Internal server error}\n\n@endpoint GET /legacy/reporting/batch_detail_records/voice/fields\n@desc Get available CDR report fields\n@returns(200) {Interaction Data: [str], Number Information: [str], Telephony Data: [str], Billing: [str]} # Available fields retrieved successfully\n@errors {401: Unauthorized, 403: Forbidden, 500: Internal server error}\n\n@endpoint DELETE /legacy/reporting/batch_detail_records/voice/{id}\n@desc Delete a CDR report request\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {data: map{id: str, start_time: str, end_time: str, call_types: [int(int32)], record_types: [int(int32)], connections: [int(int64)], report_name: str, status: int(int32), report_url: str, filters: [map], created_at: str, updated_at: str, timezone: str, source: str, retry: int(int32), managed_accounts: [str(uuid)], record_type: str}} # CDR report request deleted successfully\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endpoint GET /legacy/reporting/batch_detail_records/voice/{id}\n@desc Get a specific CDR report request\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {data: map{id: str, start_time: str, end_time: str, call_types: [int(int32)], record_types: [int(int32)], connections: [int(int64)], report_name: str, status: int(int32), report_url: str, filters: [map], created_at: str, updated_at: str, timezone: str, source: str, retry: int(int32), managed_accounts: [str(uuid)], record_type: str}} # CDR report request retrieved successfully\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endpoint GET /legacy/reporting/usage_reports/messaging\n@desc List MDR usage reports\n@optional {page: int(int32)=1 # Page number, per_page: int(int32)=20 # Size of the page}\n@returns(200) {data: [map], meta: map{total_pages: int(int32), total_results: int(int32), page_number: int(int32), page_size: int(int32)}} # Successful\n@errors {400: Bad Request}\n\n@endpoint POST /legacy/reporting/usage_reports/messaging\n@desc Create a new legacy usage V2 MDR report request\n@returns(200) {data: map{id: str(uuid), start_time: str(date-time), end_time: str(date-time), connections: [str], aggregation_type: int(int32), status: int(int32), report_url: str, result: map, created_at: str(date-time), updated_at: str(date-time), profiles: [str(uuid)], record_type: str}} # V2 legacy MDR usage report request created successfully\n@errors {400: Invalid request parameters, 401: Unauthorized, 403: Forbidden, 500: Internal server error}\n\n@endpoint DELETE /legacy/reporting/usage_reports/messaging/{id}\n@desc Delete a V2 legacy usage MDR report request\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {data: map{id: str(uuid), start_time: str(date-time), end_time: str(date-time), connections: [str], aggregation_type: int(int32), status: int(int32), report_url: str, result: map, created_at: str(date-time), updated_at: str(date-time), profiles: [str(uuid)], record_type: str}} # V2 legacy usage MDR report request deleted successfully\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endpoint GET /legacy/reporting/usage_reports/messaging/{id}\n@desc Get an MDR usage report\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {data: map{id: str(uuid), start_time: str(date-time), end_time: str(date-time), connections: [str], aggregation_type: int(int32), status: int(int32), report_url: str, result: map, created_at: str(date-time), updated_at: str(date-time), profiles: [str(uuid)], record_type: str}} # Successful\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endpoint GET /legacy/reporting/usage_reports/number_lookup\n@desc List telco data usage reports\n@optional {page: int(int32) # Page number to retrieve (1-based)., per_page: int(int32) # Filter results by per page.}\n@returns(200) {data: [map], meta: map{total_pages: int(int32), total_results: int(int32), page_number: int(int32), page_size: int(int32)}} # Successfully retrieved telco data usage reports\n@errors {400: Invalid request parameters, 401: Unauthorized, 403: Forbidden, 500: Internal server error}\n\n@endpoint POST /legacy/reporting/usage_reports/number_lookup\n@desc Submit telco data usage report\n@returns(200) {data: map{id: str(uuid), start_date: str(date), end_date: str(date), aggregation_type: str, status: str, report_url: str, created_at: str(date-time), updated_at: str(date-time), managed_accounts: [str], result: [map], record_type: str}} # Successfully submitted telco data usage report\n@errors {400: Invalid request parameters, 401: Unauthorized, 403: Forbidden, 422: Unprocessable entity, 500: Internal server error}\n\n@endpoint DELETE /legacy/reporting/usage_reports/number_lookup/{id}\n@desc Delete telco data usage report\n@required {id: str # Unique identifier of the resource.}\n@returns(200) Successfully deleted telco data usage report\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endpoint GET /legacy/reporting/usage_reports/number_lookup/{id}\n@desc Get telco data usage report by ID\n@required {id: str # Unique identifier of the resource.}\n@returns(200) {data: map{id: str(uuid), start_date: str(date), end_date: str(date), aggregation_type: str, status: str, report_url: str, created_at: str(date-time), updated_at: str(date-time), managed_accounts: [str], result: [map], record_type: str}} # Successfully retrieved telco data usage report\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endpoint GET /legacy/reporting/usage_reports/speech_to_text\n@desc Get speech to text usage report\n@optional {start_date: str(date-time) # Start of the date range filter (inclusive, ISO 8601)., end_date: str(date-time) # End of the date range filter (inclusive, ISO 8601).}\n@returns(200) {data: map} # Successful\n@errors {400: Bad Request}\n\n@endpoint GET /legacy/reporting/usage_reports/voice\n@desc List CDR usage reports\n@optional {page: int(int32)=1 # Page number, per_page: int(int32)=20 # Size of the page}\n@returns(200) {data: [map], meta: map{total_pages: int(int32), total_results: int(int32), page_number: int(int32), page_size: int(int32)}} # Successful\n@errors {400: Bad Request}\n\n@endpoint POST /legacy/reporting/usage_reports/voice\n@desc Create a new legacy usage V2 CDR report request\n@returns(200) {data: map{id: str(uuid), start_time: str(date-time), end_time: str(date-time), connections: [str], aggregation_type: int(int32), status: int(int32), report_url: str, result: map, created_at: str(date-time), updated_at: str(date-time), record_type: str, product_breakdown: int(int32)}} # V2 legacy CDR usage report request created successfully\n@errors {400: Invalid request parameters, 401: Unauthorized, 403: Forbidden, 500: Internal server error}\n\n@endpoint DELETE /legacy/reporting/usage_reports/voice/{id}\n@desc Delete a V2 legacy usage CDR report request\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {data: map{id: str(uuid), start_time: str(date-time), end_time: str(date-time), connections: [str], aggregation_type: int(int32), status: int(int32), report_url: str, result: map, created_at: str(date-time), updated_at: str(date-time), record_type: str, product_breakdown: int(int32)}} # V2 legacy usage CDR report request deleted successfully\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endpoint GET /legacy/reporting/usage_reports/voice/{id}\n@desc Get a CDR usage report\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {data: map{id: str(uuid), start_time: str(date-time), end_time: str(date-time), connections: [str], aggregation_type: int(int32), status: int(int32), report_url: str, result: map, created_at: str(date-time), updated_at: str(date-time), record_type: str, product_breakdown: int(int32)}} # Successful\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endgroup\n\n@group legacy_reporting\n@endpoint GET /legacy_reporting/batch_detail_records/messaging\n@desc Get all MDR detailed report requests\n@returns(200) {data: [map], meta: map{total_pages: int(int32), total_results: int(int32), page_number: int(int32), page_size: int(int32)}} # MDR detailed report requests retrieved successfully\n@errors {401: Unauthorized, 403: Forbidden, 500: Internal server error}\n\n@endpoint POST /legacy_reporting/batch_detail_records/messaging\n@desc Create a new MDR detailed report request\n@required {start_time: str(date-time) # Start time in ISO format, end_time: str(date-time) # End time in ISO format. Note: If end time includes the last 4 hours, some MDRs might not appear in this report, due to wait time for downstream message delivery confirmation}\n@optional {timezone: str # Timezone for the report, directions: [int(int32)] # List of directions to filter by (Inbound = 1, Outbound = 2), record_types: [int(int32)] # List of record types to filter by (Complete = 1, Incomplete = 2, Errors = 3), connections: [int(int64)] # List of connections to filter by, report_name: str # Name of the report, include_message_body: bool # Whether to include message body in the report, filters: [map{filter_type: str, cli: str, cli_filter: str, cld: str, cld_filter: str, tags_list: str, billing_group: str}] # List of filters to apply, profiles: [str(uuid)] # List of messaging profile IDs to filter by, managed_accounts: [str(uuid)] # List of managed accounts to include, select_all_managed_accounts: bool # Whether to select all managed accounts}\n@returns(200) {data: map{id: str(uuid), start_date: str(date-time), end_date: str(date-time), directions: [str], record_types: [str], connections: [int(int64)], report_name: str, status: str, report_url: str, filters: [map], created_at: str(date-time), updated_at: str(date-time), profiles: [str(uuid)], record_type: str}} # MDR detailed report request created successfully\n@errors {400: Invalid request parameters, 401: Unauthorized, 403: Forbidden, 500: Internal server error}\n\n@endpoint DELETE /legacy_reporting/batch_detail_records/messaging/{id}\n@desc Delete a MDR detailed report request\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {data: map{id: str(uuid), start_date: str(date-time), end_date: str(date-time), directions: [str], record_types: [str], connections: [int(int64)], report_name: str, status: str, report_url: str, filters: [map], created_at: str(date-time), updated_at: str(date-time), profiles: [str(uuid)], record_type: str}} # MDR detailed report request deleted successfully\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endpoint GET /legacy_reporting/batch_detail_records/messaging/{id}\n@desc Get a specific MDR detailed report request\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {data: map{id: str(uuid), start_date: str(date-time), end_date: str(date-time), directions: [str], record_types: [str], connections: [int(int64)], report_name: str, status: str, report_url: str, filters: [map], created_at: str(date-time), updated_at: str(date-time), profiles: [str(uuid)], record_type: str}} # MDR detailed report request retrieved successfully\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endpoint GET /legacy_reporting/batch_detail_records/voice\n@desc Get all CDR report requests\n@returns(200) {data: [map], meta: map{total_pages: int(int32), total_results: int(int32), page_number: int(int32), page_size: int(int32)}} # CDR report requests retrieved successfully\n@errors {401: Unauthorized, 403: Forbidden, 500: Internal server error}\n\n@endpoint POST /legacy_reporting/batch_detail_records/voice\n@desc Create a new CDR report request\n@required {start_time: str(date-time) # Start time in ISO format, end_time: str(date-time) # End time in ISO format}\n@optional {timezone: str # Timezone for the report, call_types: [int(int32)] # List of call types to filter by (Inbound = 1, Outbound = 2), record_types: [int(int32)] # List of record types to filter by (Complete = 1, Incomplete = 2, Errors = 3), connections: [int(int64)] # List of connections to filter by, report_name: str # Name of the report, source: str # Source of the report. Valid values: calls (default), call-control, fax-api, webrtc, include_all_metadata: bool # Whether to include all metadata, filters: [map{filter_type: str, cli: str, cli_filter: str, cld: str, cld_filter: str, tags_list: str, billing_group: str}] # List of filters to apply, fields: [str] # Set of fields to include in the report, managed_accounts: [str(uuid)] # List of managed accounts to include, select_all_managed_accounts: bool # Whether to select all managed accounts}\n@returns(200) {data: map{id: str, start_time: str, end_time: str, call_types: [int(int32)], record_types: [int(int32)], connections: [int(int64)], report_name: str, status: int(int32), report_url: str, filters: [map], created_at: str, updated_at: str, timezone: str, source: str, retry: int(int32), managed_accounts: [str(uuid)], record_type: str}} # CDR report request created successfully\n@errors {400: Invalid request parameters, 401: Unauthorized, 403: Forbidden, 500: Internal server error}\n\n@endpoint GET /legacy_reporting/batch_detail_records/voice/fields\n@desc Get available CDR report fields\n@returns(200) {Interaction Data: [str], Number Information: [str], Telephony Data: [str], Billing: [str]} # Available fields retrieved successfully\n@errors {401: Unauthorized, 403: Forbidden, 500: Internal server error}\n\n@endpoint DELETE /legacy_reporting/batch_detail_records/voice/{id}\n@desc Delete a CDR report request\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {data: map{id: str, start_time: str, end_time: str, call_types: [int(int32)], record_types: [int(int32)], connections: [int(int64)], report_name: str, status: int(int32), report_url: str, filters: [map], created_at: str, updated_at: str, timezone: str, source: str, retry: int(int32), managed_accounts: [str(uuid)], record_type: str}} # CDR report request deleted successfully\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endpoint GET /legacy_reporting/batch_detail_records/voice/{id}\n@desc Get a specific CDR report request\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {data: map{id: str, start_time: str, end_time: str, call_types: [int(int32)], record_types: [int(int32)], connections: [int(int64)], report_name: str, status: int(int32), report_url: str, filters: [map], created_at: str, updated_at: str, timezone: str, source: str, retry: int(int32), managed_accounts: [str(uuid)], record_type: str}} # CDR report request retrieved successfully\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endpoint GET /legacy_reporting/usage_reports/messaging\n@desc List MDR usage reports\n@optional {page: int(int32)=1 # Page number, per_page: int(int32)=20 # Size of the page}\n@returns(200) {data: [map], meta: map{total_pages: int(int32), total_results: int(int32), page_number: int(int32), page_size: int(int32)}} # Successful\n@errors {400: Bad Request}\n\n@endpoint POST /legacy_reporting/usage_reports/messaging\n@desc Create a new legacy usage V2 MDR report request\n@returns(200) {data: map{id: str(uuid), start_time: str(date-time), end_time: str(date-time), connections: [str], aggregation_type: int(int32), status: int(int32), report_url: str, result: map, created_at: str(date-time), updated_at: str(date-time), profiles: [str(uuid)], record_type: str}} # V2 legacy MDR usage report request created successfully\n@errors {400: Invalid request parameters, 401: Unauthorized, 403: Forbidden, 500: Internal server error}\n\n@endpoint DELETE /legacy_reporting/usage_reports/messaging/{id}\n@desc Delete a V2 legacy usage MDR report request\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {data: map{id: str(uuid), start_time: str(date-time), end_time: str(date-time), connections: [str], aggregation_type: int(int32), status: int(int32), report_url: str, result: map, created_at: str(date-time), updated_at: str(date-time), profiles: [str(uuid)], record_type: str}} # V2 legacy usage MDR report request deleted successfully\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endpoint GET /legacy_reporting/usage_reports/messaging/{id}\n@desc Get an MDR usage report\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {data: map{id: str(uuid), start_time: str(date-time), end_time: str(date-time), connections: [str], aggregation_type: int(int32), status: int(int32), report_url: str, result: map, created_at: str(date-time), updated_at: str(date-time), profiles: [str(uuid)], record_type: str}} # Successful\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endpoint GET /legacy_reporting/usage_reports/number_lookup\n@desc List telco data usage reports\n@optional {page: int(int32) # Page number to retrieve (1-based)., per_page: int(int32) # Filter results by per page.}\n@returns(200) {data: [map], meta: map{total_pages: int(int32), total_results: int(int32), page_number: int(int32), page_size: int(int32)}} # Successfully retrieved telco data usage reports\n@errors {400: Invalid request parameters, 401: Unauthorized, 403: Forbidden, 500: Internal server error}\n\n@endpoint POST /legacy_reporting/usage_reports/number_lookup\n@desc Submit telco data usage report\n@returns(200) {data: map{id: str(uuid), start_date: str(date), end_date: str(date), aggregation_type: str, status: str, report_url: str, created_at: str(date-time), updated_at: str(date-time), managed_accounts: [str], result: [map], record_type: str}} # Successfully submitted telco data usage report\n@errors {400: Invalid request parameters, 401: Unauthorized, 403: Forbidden, 422: Unprocessable entity, 500: Internal server error}\n\n@endpoint DELETE /legacy_reporting/usage_reports/number_lookup/{id}\n@desc Delete telco data usage report\n@required {id: str # Unique identifier of the resource.}\n@returns(200) Successfully deleted telco data usage report\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endpoint GET /legacy_reporting/usage_reports/number_lookup/{id}\n@desc Get telco data usage report by ID\n@required {id: str # Unique identifier of the resource.}\n@returns(200) {data: map{id: str(uuid), start_date: str(date), end_date: str(date), aggregation_type: str, status: str, report_url: str, created_at: str(date-time), updated_at: str(date-time), managed_accounts: [str], result: [map], record_type: str}} # Successfully retrieved telco data usage report\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endpoint GET /legacy_reporting/usage_reports/speech_to_text\n@desc Get speech to text usage report\n@optional {start_date: str(date-time) # Start of the date range filter (inclusive, ISO 8601)., end_date: str(date-time) # End of the date range filter (inclusive, ISO 8601).}\n@returns(200) {data: map} # Successful\n@errors {400: Bad Request}\n\n@endpoint GET /legacy_reporting/usage_reports/voice\n@desc List CDR usage reports\n@optional {page: int(int32)=1 # Page number, per_page: int(int32)=20 # Size of the page}\n@returns(200) {data: [map], meta: map{total_pages: int(int32), total_results: int(int32), page_number: int(int32), page_size: int(int32)}} # Successful\n@errors {400: Bad Request}\n\n@endpoint POST /legacy_reporting/usage_reports/voice\n@desc Create a new legacy usage V2 CDR report request\n@returns(200) {data: map{id: str(uuid), start_time: str(date-time), end_time: str(date-time), connections: [str], aggregation_type: int(int32), status: int(int32), report_url: str, result: map, created_at: str(date-time), updated_at: str(date-time), record_type: str, product_breakdown: int(int32)}} # V2 legacy CDR usage report request created successfully\n@errors {400: Invalid request parameters, 401: Unauthorized, 403: Forbidden, 500: Internal server error}\n\n@endpoint DELETE /legacy_reporting/usage_reports/voice/{id}\n@desc Delete a V2 legacy usage CDR report request\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {data: map{id: str(uuid), start_time: str(date-time), end_time: str(date-time), connections: [str], aggregation_type: int(int32), status: int(int32), report_url: str, result: map, created_at: str(date-time), updated_at: str(date-time), record_type: str, product_breakdown: int(int32)}} # V2 legacy usage CDR report request deleted successfully\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endpoint GET /legacy_reporting/usage_reports/voice/{id}\n@desc Get a CDR usage report\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {data: map{id: str(uuid), start_time: str(date-time), end_time: str(date-time), connections: [str], aggregation_type: int(int32), status: int(int32), report_url: str, result: map, created_at: str(date-time), updated_at: str(date-time), record_type: str, product_breakdown: int(int32)}} # Successful\n@errors {401: Unauthorized, 403: Forbidden, 404: Report not found, 500: Internal server error}\n\n@endgroup\n\n@group list\n@endpoint GET /list\n@desc List All Numbers using Channel Billing\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # A list of numbers using GCB, grouped by channel zone\n@errors {400: Bad request, 401: Unauthorized, 404: Resource not found}\n\n@endpoint GET /list/{channel_zone_id}\n@desc List Numbers using Channel Billing for a specific Zone\n@required {channel_zone_id: str # Channel zone identifier}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # A list of numbers using GCB, grouped by channel zone\n@errors {400: Bad request, 401: Unauthorized, 404: Resource not found}\n\n@endgroup\n\n@group machine-payments\n@endpoint POST /machine-payments/account-credit\n@desc Create a machine payment account credit\n@required {amount_usd: str # Amount to credit in USD, as a decimal string with up to two fractional digits (by default between 5.00 and 500.00). The request body is required on the initial challenge request and remains required on a paid retry, where you re-send the identical body plus the payment credential — the credential, not the body, selects the payment, and the retried body is not re-validated.}\n@returns(200) {data: map{id: str, record_type: str, account_id: str, amount: str, currency: str, payment_source: str, provider: str?, payment_method: str?, payment_intent_id: str?, receipt_reference: str?, mpp_resource: str?, status: str?, created: bool, created_at: str(date-time)}} # Successful duplicate paid retry — the existing account-credit transaction is returned and the account is not credited again. This applies when Rails reaches its duplicate-transaction lookup; re-sending the same Stripe credential may instead be rejected by the upstream provider as an idempotent replay and return `402 Payment Required`.\n@returns(201) {data: map{id: str, record_type: str, account_id: str, amount: str, currency: str, payment_source: str, provider: str?, payment_method: str?, payment_intent_id: str?, receipt_reference: str?, mpp_resource: str?, status: str?, created: bool, created_at: str(date-time)}} # Account credit created from a verified machine payment\n@errors {400: Bad request — proxied verbatim from the upstream machine payment service when it rejects the request: a malformed or undeserializable `Authorization: Payment ...` credential, a payment credential whose amount violates the upstream amount policy, or a request that fails upstream schema validation. The body is the upstream singular `error` envelope, not the standard Telnyx `errors` array., 401: Unauthorized — the request carried neither valid Telnyx API credentials nor an `Authorization: Payment ...` credential, 402: Payment required. One or more Machine Payment Protocol challenges (for example separate Tempo and Stripe challenges) are returned in the `WWW-Authenticate` header. Construct a payment credential from a challenge and retry the request with an `Authorization: Payment ...` header., 403: Forbidden — machine payments are not enabled for the account, the account tier is ineligible, the account is suspended, or the request origin is not permitted. Note: when the account is suspended the failure is returned via `render_failure` as `{\"success\": false, \"message\": \"You must verify your identity before you may perform this action.\", \"reasons\": []}` rather than the standard `errors` envelope., 404: Not found — proxied verbatim from the upstream machine payment service when the machine payment provider is disabled. The body is the upstream singular `error` envelope, not the standard Telnyx `errors` array., 409: Conflict — the payment maps to an already-recorded account credit with different fulfillment metadata, so the account is not credited again, 422: Unprocessable entity — missing or invalid `amount_usd`, or the request fails account-credit policy checks, 502: Bad gateway — the upstream machine payment service failed to process the request. Other upstream failure statuses (for example 404 when the machine payment provider is disabled, or 400 for schema validation failures) may be proxied verbatim to the client.}\n@example_request {\"amount_usd\":\"10.00\"}\n\n@endgroup\n\n@group managed_accounts\n@endpoint GET /managed_accounts\n@desc Lists accounts managed by the current user.\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[email][contains], filter[email][eq], filter[organization_name][contains], filter[organization_name][eq], filter[status][eq], page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size], sort: str(created_at/email)=created_at # Specifies the sort order for results. By default sorting direction is ascending. To have the results sorted in descending order add the  - prefix. That is:         email: sorts the result by the     email field in ascending order.            -email: sorts the result by the     email field in descending order.      If not given, results are sorted by created_at in descending order., include_cancelled_accounts: bool=false # Specifies if cancelled accounts should be included in the results.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of managed accounts.\n@errors {401: Unauthenticated response. Happens when the current user cannot be authenticated.}\n\n@endpoint POST /managed_accounts\n@desc Create a new managed account.\n@required {business_name: str # The name of the business for which the new managed account is being created, that will be used as the managed accounts's organization's name.}\n@optional {email: str # The email address for the managed account. If not provided, the email address will be generated based on the email address of the manager account., password: str # Password for the managed account. If a password is not supplied, the account will not be able to be signed into directly. (A password reset may still be performed later to enable sign-in via password.), managed_account_allow_custom_pricing: bool # Boolean value that indicates if the managed account is able to have custom pricing set for it or not. If false, uses the pricing of the manager account. Defaults to false. This value may be changed after creation, but there may be time lag between when the value is changed and pricing changes take effect., rollup_billing: bool # Boolean value that indicates if the billing information and charges to the managed account \"roll up\" to the manager account. If true, the managed account will not have its own balance and will use the shared balance with the manager account. This value cannot be changed after account creation without going through Telnyx support as changes require manual updates to the account ledger. Defaults to false.}\n@returns(200) {data: map{record_type: str, id: str(uuid), email: str(email), api_key: str, api_user: str, api_token: str, organization_name: str, manager_account_id: str, balance: map{record_type: str, balance: str, credit_limit: str, available_credit: str, currency: str}, created_at: str, updated_at: str, managed_account_allow_custom_pricing: bool, rollup_billing: bool}} # Successful response with information about a single managed account.\n@errors {401: Unauthenticated response. Happens when the current user cannot be authenticated., 422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint GET /managed_accounts/allocatable_global_outbound_channels\n@desc Display information about allocatable global outbound channels for the current user.\n@returns(200) {data: map{managed_account_allow_custom_pricing: bool, allocatable_global_outbound_channels: int, record_type: str, total_global_channels_allocated: int}} # Successful response with information about allocatable global outbound channels.\n@errors {401: Unauthenticated response. Happens when the current user cannot be authenticated., 403: Unauthorized response. Happens when the current user is not authorized to access the endpoint.}\n\n@endpoint GET /managed_accounts/{id}\n@desc Retrieve a managed account\n@required {id: str # Managed Account User ID}\n@returns(200) {data: map{record_type: str, id: str(uuid), email: str(email), api_key: str, api_user: str, api_token: str, organization_name: str, manager_account_id: str, balance: map{record_type: str, balance: str, credit_limit: str, available_credit: str, currency: str}, created_at: str, updated_at: str, managed_account_allow_custom_pricing: bool, rollup_billing: bool}} # Successful response with information about a single managed account.\n@errors {401: Unauthenticated response. Happens when the current user cannot be authenticated., 404: Resource not found}\n\n@endpoint PATCH /managed_accounts/{id}\n@desc Update a managed account\n@required {id: str # Managed Account User ID}\n@optional {managed_account_allow_custom_pricing: bool # Boolean value that indicates if the managed account is able to have custom pricing set for it or not. If false, uses the pricing of the manager account. Defaults to false. This value may be changed, but there may be time lag between when the value is changed and pricing changes take effect.}\n@returns(200) {data: map{record_type: str, id: str(uuid), email: str(email), api_key: str, api_user: str, api_token: str, organization_name: str, manager_account_id: str, balance: map{record_type: str, balance: str, credit_limit: str, available_credit: str, currency: str}, created_at: str, updated_at: str, managed_account_allow_custom_pricing: bool, rollup_billing: bool}} # Successful response with information about a single managed account.\n@errors {401: Unauthenticated response. Happens when the current user cannot be authenticated., 404: Resource not found, 422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint POST /managed_accounts/{id}/actions/disable\n@desc Disables a managed account\n@required {id: str # Managed Account User ID}\n@returns(200) {data: map{record_type: str, id: str(uuid), email: str(email), api_key: str, api_user: str, api_token: str, organization_name: str, manager_account_id: str, balance: map{record_type: str, balance: str, credit_limit: str, available_credit: str, currency: str}, created_at: str, updated_at: str, managed_account_allow_custom_pricing: bool, rollup_billing: bool}} # Successful response with information about a single managed account.\n@errors {401: Unauthenticated response. Happens when the current user cannot be authenticated., 404: Resource not found, 422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint POST /managed_accounts/{id}/actions/enable\n@desc Enables a managed account\n@required {id: str # Managed Account User ID}\n@optional {reenable_all_connections: bool=false # When true, all connections owned by this managed account will automatically be re-enabled. Note: Any connections that do not pass validations will not be re-enabled.}\n@returns(200) {data: map{record_type: str, id: str(uuid), email: str(email), api_key: str, api_user: str, api_token: str, organization_name: str, manager_account_id: str, balance: map{record_type: str, balance: str, credit_limit: str, available_credit: str, currency: str}, created_at: str, updated_at: str, managed_account_allow_custom_pricing: bool, rollup_billing: bool}} # Successful response with information about a single managed account.\n@errors {401: Unauthenticated response. Happens when the current user cannot be authenticated., 404: Resource not found, 422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint PATCH /managed_accounts/{id}/update_global_channel_limit\n@desc Update the amount of allocatable global outbound channels allocated to a specific managed account.\n@required {id: str # Managed Account User ID}\n@optional {channel_limit: int # Integer value that indicates the number of allocatable global outbound channels that should be allocated to the managed account. Must be 0 or more. If the value is 0 then the account will have no usable channels and will not be able to perform outbound calling.}\n@returns(200) {data: map{channel_limit: int, email: str, id: str, manager_account_id: str, record_type: str}} # Successful response with information about the allocatable global outbound channels for the given account.\n@errors {401: Unauthenticated response. Happens when the current user cannot be authenticated., 404: Resource not found, 422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endgroup\n\n@group media\n@endpoint GET /media\n@desc List uploaded media\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[content_type][]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # A response with a list of media resources\n@errors {401: Unexpected error}\n\n@endpoint POST /media\n@desc Upload media\n@required {media_url: str # The URL where the media to be stored in Telnyx network is currently hosted. The maximum allowed size is 20 MB.}\n@optional {ttl_secs: int # The number of seconds after which the media resource will be deleted, defaults to 2 days. The maximum allowed vale is 630720000, which translates to 20 years., media_name: str # The unique identifier of a file.}\n@returns(201) {data: map{media_name: str, expires_at: str, created_at: str, updated_at: str, content_type: str}} # A response describing a media resource\n@errors {401: Unexpected error, 422: Unexpected error}\n\n@endpoint DELETE /media/{media_name}\n@desc Deletes stored media\n@required {media_name: str # Uniquely identifies a media resource.}\n@returns(204) The media was deleted successfully.\n@errors {401: Unexpected error, 404: Unexpected error}\n\n@endpoint GET /media/{media_name}\n@desc Retrieve stored media\n@required {media_name: str # Uniquely identifies a media resource.}\n@returns(200) {data: map{media_name: str, expires_at: str, created_at: str, updated_at: str, content_type: str}} # A response describing a media resource\n@errors {401: Unexpected error, 404: Unexpected error}\n\n@endpoint PUT /media/{media_name}\n@desc Update stored media\n@required {media_name: str # Uniquely identifies a media resource.}\n@optional {media_url: str # The URL where the media to be stored in Telnyx network is currently hosted. The maximum allowed size is 20 MB., ttl_secs: int # The number of seconds after which the media resource will be deleted, defaults to 2 days. The maximum allowed vale is 630720000, which translates to 20 years.}\n@returns(200) {data: map{media_name: str, expires_at: str, created_at: str, updated_at: str, content_type: str}} # A response describing a media resource\n@errors {401: Unexpected error, 404: Unexpected error, 422: Unexpected error}\n\n@endpoint GET /media/{media_name}/download\n@desc Download stored media\n@required {media_name: str # Uniquely identifies a media resource.}\n@returns(200) A response describing a media resource\n@errors {401: Unexpected error, 404: Unexpected error, 422: Unexpected error}\n\n@endgroup\n\n@group meeting_sessions\n@endpoint GET /meeting_sessions\n@desc List meeting sessions\n@optional {status: str(scheduled/joining/waiting_for_admission/active/leaving/ended/failed/admission_denied) # Filter meeting sessions by current status.}\n@returns(200) {data: [map]} # Successful response with a list of meeting sessions.\n@errors {400: Bad Request, 401: Unauthorized. On api.telnyx.com, authentication is enforced by the API gateway before the request reaches the Meeting service, so a missing or invalid API key returns the standard Telnyx error envelope (`{\"errors\": [{\"code\": \"10009\", ...}]}`) rather than the single-`error` shape below., 403: The authenticated credential is not permitted to perform this operation., 429: Authentication is temporarily overloaded. Retry after the number of seconds in `Retry-After`., 500: Internal Server Error, 503: Authentication is temporarily unavailable.}\n\n@endpoint POST /meeting_sessions\n@desc Create a meeting session\n@required {meeting_url: str(uri) # The meeting URL the bot should join.}\n@optional {bot_name: str # Display name for the bot in the meeting. Defaults to \"Meeting Bot\"., join_at: str(date-time) # ISO-8601 timestamp in the future at which the bot should join. If omitted, the bot joins immediately., voice: str # Session-default voice identifier used for `speak_on_enter` and ordinary speak actions. A voice supplied on an individual speak action overrides this default for that utterance., speak_on_enter: str # Text the bot speaks when it enters the meeting. **Not spoken when an `assistant` is attached**: the value is accepted and echoed back on the session, but the assistant owns the voice and the line is never delivered, with no event reporting the omission. Use `chat_on_enter` to announce an assistant-backed bot., chat_on_enter: str # A message the bot posts to the meeting's chat as soon as it becomes active — typically a recording disclosure. Delivered at most once. Independent of `speak_on_enter`: both may be set, and the chat message posts first because it does not wait for text-to-speech or avatar startup. Rejected with 422 `unsupported_capability` on platforms without meeting chat., barge_in: bool=false # When enabled, a human participant `speech_on` event interrupts and stops the current bot audio; it does not bypass admission or initiate speech. Assistant sessions reject `barge_in: true`., summarize_on_end: bool=false # If true, generate a summary artifact when the session ends., camera_image: map # Write-only static camera-tile image for this session, not a native account or participant profile photo. Supply exactly one JPEG source. When effective, the image is used as the bot's static camera/video output; presentation varies by meeting platform and recording configuration and is not guaranteed in recordings. An effective Avatar or Assistant webpage output takes precedence, so this input is ignored and a URL source is not fetched., webhook_url: str(uri) # HTTPS endpoint to receive session lifecycle callbacks. Static validation requires HTTPS, rejects embedded credentials and blocked hosts, and enforces egress policy. Validation makes no network request to the endpoint., metadata: map # Arbitrary key-value metadata attached to the session. The serialized JSON representation must not exceed 16384 characters at runtime., idempotency_key: str # Client-supplied idempotency key to safely retry creation requests without duplicating sessions. Lookup is scoped to the authenticated account and compares the key only; the request payload is not fingerprinted or compared., avatar: map{provider!: str, avatar_id!: str, api_key!: str} # Request options for attaching a bring-your-own-key avatar to the session., assistant: map{id!: str, audio_gate: str, dynamic_variables: map, leave_on_end: bool} # Attach a Telnyx AI Assistant to the session. Supply the Assistant's ID; the Meeting service connects it to the meeting directly. The Call Control connection, caller ID and loopback SIP URI previously required here have been removed and are now rejected as unknown fields.}\n@returns(200) {data: map{id: str, account_id: str, provider: str, status: str, status_detail: str?, recording: bool, meeting_url: str(uri), platform: str, bot_name: str, config: map{voice: str?, speak_on_enter: str?, chat_on_enter: any, barge_in: bool, summarize_on_end: bool}, avatar: any, avatar_state: str?, avatar_state_changed_at: str(date-time)?, assistant: any, assistant_state: str?, assistant_state_changed_at: str(date-time)?, webhook_url: str(uri)?, metadata: map, failure_reason: str?, created_at: str(date-time), join_at: str(date-time)?, joined_at: str(date-time)?, ended_at: str(date-time)?, updated_at: str(date-time)}} # Replayed existing meeting session matching the account-scoped idempotency_key. Replay is key-only; the request payload is not fingerprinted or compared.\n@returns(201) {data: map{id: str, account_id: str, provider: str, status: str, status_detail: str?, recording: bool, meeting_url: str(uri), platform: str, bot_name: str, config: map{voice: str?, speak_on_enter: str?, chat_on_enter: any, barge_in: bool, summarize_on_end: bool}, avatar: any, avatar_state: str?, avatar_state_changed_at: str(date-time)?, assistant: any, assistant_state: str?, assistant_state_changed_at: str(date-time)?, webhook_url: str(uri)?, metadata: map, failure_reason: str?, created_at: str(date-time), join_at: str(date-time)?, joined_at: str(date-time)?, ended_at: str(date-time)?, updated_at: str(date-time), webhook_secret: str}} # New meeting session created.\n@errors {400: Bad Request, 401: Unauthorized. On api.telnyx.com, authentication is enforced by the API gateway before the request reaches the Meeting service, so a missing or invalid API key returns the standard Telnyx error envelope (`{\"errors\": [{\"code\": \"10009\", ...}]}`) rather than the single-`error` shape below., 403: The authenticated credential is not permitted to perform this operation., 413: Payload Too Large, 422: Unprocessable Entity, including an unsupported capability, 429: Authentication is temporarily overloaded. Retry after the number of seconds in `Retry-After`., 500: Internal Server Error, 502: The meeting provider rejected bot creation., 503: A required feature or dependency is not configured or authentication is unavailable.}\n\n@endpoint DELETE /meeting_sessions/{id}\n@desc Delete a meeting session\n@required {id: str # Unique identifier for the meeting session.}\n@returns(200) {data: map{id: str, account_id: str, provider: str, status: str, status_detail: str?, recording: bool, meeting_url: str(uri), platform: str, bot_name: str, config: map{voice: str?, speak_on_enter: str?, chat_on_enter: any, barge_in: bool, summarize_on_end: bool}, avatar: any, avatar_state: str?, avatar_state_changed_at: str(date-time)?, assistant: any, assistant_state: str?, assistant_state_changed_at: str(date-time)?, webhook_url: str(uri)?, metadata: map, failure_reason: str?, created_at: str(date-time), join_at: str(date-time)?, joined_at: str(date-time)?, ended_at: str(date-time)?, updated_at: str(date-time)}} # Successful response with the deleted meeting session.\n@errors {401: Unauthorized. On api.telnyx.com, authentication is enforced by the API gateway before the request reaches the Meeting service, so a missing or invalid API key returns the standard Telnyx error envelope (`{\"errors\": [{\"code\": \"10009\", ...}]}`) rather than the single-`error` shape below., 403: The authenticated credential is not permitted to perform this operation., 404: Not Found, 409: Conflict, 429: Authentication is temporarily overloaded. Retry after the number of seconds in `Retry-After`., 500: Internal Server Error, 502: The meeting provider rejected cancellation or leave., 503: A required feature or dependency is not configured or authentication is unavailable.}\n\n@endpoint GET /meeting_sessions/{id}\n@desc Retrieve a meeting session\n@required {id: str # Unique identifier for the meeting session.}\n@returns(200) {data: map{id: str, account_id: str, provider: str, status: str, status_detail: str?, recording: bool, meeting_url: str(uri), platform: str, bot_name: str, config: map{voice: str?, speak_on_enter: str?, chat_on_enter: any, barge_in: bool, summarize_on_end: bool}, avatar: any, avatar_state: str?, avatar_state_changed_at: str(date-time)?, assistant: any, assistant_state: str?, assistant_state_changed_at: str(date-time)?, webhook_url: str(uri)?, metadata: map, failure_reason: str?, created_at: str(date-time), join_at: str(date-time)?, joined_at: str(date-time)?, ended_at: str(date-time)?, updated_at: str(date-time)}} # Successful response with the meeting session.\n@errors {401: Unauthorized. On api.telnyx.com, authentication is enforced by the API gateway before the request reaches the Meeting service, so a missing or invalid API key returns the standard Telnyx error envelope (`{\"errors\": [{\"code\": \"10009\", ...}]}`) rather than the single-`error` shape below., 403: The authenticated credential is not permitted to perform this operation., 404: Not Found, 429: Authentication is temporarily overloaded. Retry after the number of seconds in `Retry-After`., 500: Internal Server Error, 503: Authentication is temporarily unavailable.}\n\n@endpoint PATCH /meeting_sessions/{id}\n@desc Update a meeting session\n@required {id: str # Unique identifier for the meeting session.}\n@optional {join_at: str(date-time) # ISO-8601 timestamp for the bot to join. May be updated to reschedule., bot_name: str # Updated display name for the bot.}\n@returns(200) {data: map{id: str, account_id: str, provider: str, status: str, status_detail: str?, recording: bool, meeting_url: str(uri), platform: str, bot_name: str, config: map{voice: str?, speak_on_enter: str?, chat_on_enter: any, barge_in: bool, summarize_on_end: bool}, avatar: any, avatar_state: str?, avatar_state_changed_at: str(date-time)?, assistant: any, assistant_state: str?, assistant_state_changed_at: str(date-time)?, webhook_url: str(uri)?, metadata: map, failure_reason: str?, created_at: str(date-time), join_at: str(date-time)?, joined_at: str(date-time)?, ended_at: str(date-time)?, updated_at: str(date-time)}} # Successful response with the updated meeting session.\n@errors {400: Bad Request, 401: Unauthorized. On api.telnyx.com, authentication is enforced by the API gateway before the request reaches the Meeting service, so a missing or invalid API key returns the standard Telnyx error envelope (`{\"errors\": [{\"code\": \"10009\", ...}]}`) rather than the single-`error` shape below., 403: The authenticated credential is not permitted to perform this operation., 404: Not Found, 409: Conflict, 413: Payload Too Large, 429: Authentication is temporarily overloaded. Retry after the number of seconds in `Retry-After`., 500: Internal Server Error, 502: The meeting provider rejected the scheduled-session update., 503: A required feature or dependency is not configured or authentication is unavailable.}\n@example_request {\"join_at\":\"2026-08-05T17:00:00Z\"}\n\n@endpoint POST /meeting_sessions/{id}/actions/send_chat\n@desc Send chat in a meeting session\n@required {id: str # Unique identifier for the meeting session., text: str # Chat message text to send in the meeting.}\n@returns(202) {data: map{accepted: bool}} # The chat message was accepted and is being delivered.\n@errors {400: Bad Request, 401: Unauthorized. On api.telnyx.com, authentication is enforced by the API gateway before the request reaches the Meeting service, so a missing or invalid API key returns the standard Telnyx error envelope (`{\"errors\": [{\"code\": \"10009\", ...}]}`) rather than the single-`error` shape below., 403: The authenticated credential is not permitted to perform this operation., 404: Not Found, 409: Conflict, 413: Payload Too Large, 422: Unprocessable Entity, including an unsupported capability, 429: Authentication is temporarily overloaded. Retry after the number of seconds in `Retry-After`., 500: Internal Server Error, 502: The meeting provider rejected native chat delivery., 503: A required feature or dependency is not configured or authentication is unavailable.}\n@example_request {\"text\":\"I will send the summary after this call.\"}\n\n@endpoint POST /meeting_sessions/{id}/actions/speak\n@desc Speak in a meeting session\n@required {id: str # Unique identifier for the meeting session., text: str # Text for the bot to speak.}\n@optional {voice: str # Voice identifier to use for this utterance. When supplied, it overrides the session-default voice configured at creation; otherwise the speak action uses that session default., interrupt: bool # If true, interrupt any currently playing audio to speak this text immediately.}\n@returns(202) {data: map{accepted: bool}} # The speak action was accepted and is being processed.\n@errors {400: Bad Request, 401: Unauthorized. On api.telnyx.com, authentication is enforced by the API gateway before the request reaches the Meeting service, so a missing or invalid API key returns the standard Telnyx error envelope (`{\"errors\": [{\"code\": \"10009\", ...}]}`) rather than the single-`error` shape below., 403: The authenticated credential is not permitted to perform this operation., 404: Not Found, 409: Conflict, 413: Payload Too Large, 422: Unprocessable Entity, including an unsupported capability, 429: Authentication is temporarily overloaded. Retry after the number of seconds in `Retry-After`., 500: Internal Server Error, 502: Text-to-speech generation or meeting audio delivery failed., 503: A required feature or dependency is not configured or authentication is unavailable.}\n@example_request {\"text\":\"Here are the three decisions from this call.\",\"interrupt\":false}\n\n@endpoint POST /meeting_sessions/{id}/actions/stop_speaking\n@desc Stop speaking in a meeting session\n@required {id: str # Unique identifier for the meeting session.}\n@returns(202) {data: map{accepted: bool}} # The stop-speaking action was accepted.\n@errors {401: Unauthorized. On api.telnyx.com, authentication is enforced by the API gateway before the request reaches the Meeting service, so a missing or invalid API key returns the standard Telnyx error envelope (`{\"errors\": [{\"code\": \"10009\", ...}]}`) rather than the single-`error` shape below., 403: The authenticated credential is not permitted to perform this operation., 404: Not Found, 409: Conflict, 422: Unprocessable Entity, including an unsupported capability, 429: Authentication is temporarily overloaded. Retry after the number of seconds in `Retry-After`., 500: Internal Server Error, 502: The meeting provider rejected stopping audio playback., 503: A required feature or dependency is not configured or authentication is unavailable.}\n\n@endpoint GET /meeting_sessions/{id}/artifacts\n@desc List meeting session artifacts\n@required {id: str # Unique identifier for the meeting session.}\n@returns(200) {data: [map]} # Successful response with a list of meeting session artifacts.\n@errors {401: Unauthorized. On api.telnyx.com, authentication is enforced by the API gateway before the request reaches the Meeting service, so a missing or invalid API key returns the standard Telnyx error envelope (`{\"errors\": [{\"code\": \"10009\", ...}]}`) rather than the single-`error` shape below., 403: The authenticated credential is not permitted to perform this operation., 404: Not Found, 429: Authentication is temporarily overloaded. Retry after the number of seconds in `Retry-After`., 500: Internal Server Error, 503: Authentication is temporarily unavailable.}\n\n@endpoint POST /meeting_sessions/{id}/artifacts\n@desc Create a meeting session artifact\n@required {id: str # Unique identifier for the meeting session.}\n@returns(202) {data: map{id: str, session_id: str, type: str, status: str, content: any, model_provenance: any, failure_reason: str?, created_at: str(date-time), updated_at: str(date-time), prompt: any}} # Artifact creation accepted and is being processed asynchronously.\n@errors {400: Bad Request, 401: Unauthorized. On api.telnyx.com, authentication is enforced by the API gateway before the request reaches the Meeting service, so a missing or invalid API key returns the standard Telnyx error envelope (`{\"errors\": [{\"code\": \"10009\", ...}]}`) rather than the single-`error` shape below., 403: The authenticated credential is not permitted to perform this operation., 404: Not Found, 409: Conflict, 413: Payload Too Large, 429: Authentication is temporarily overloaded. Retry after the number of seconds in `Retry-After`., 500: Internal Server Error, 503: Artifact generation or authentication is not configured or temporarily unavailable.}\n@example_request {\"type\":\"summary\"}\n\n@endpoint GET /meeting_sessions/{id}/artifacts/{artifact_id}\n@desc Retrieve a meeting session artifact\n@required {id: str # Unique identifier for the meeting session., artifact_id: str # Unique identifier for a meeting session artifact.}\n@returns(200) {data: map{id: str, session_id: str, type: str, status: str, content: any, model_provenance: any, failure_reason: str?, created_at: str(date-time), updated_at: str(date-time), prompt: any}} # Successful response with the meeting session artifact.\n@errors {401: Unauthorized. On api.telnyx.com, authentication is enforced by the API gateway before the request reaches the Meeting service, so a missing or invalid API key returns the standard Telnyx error envelope (`{\"errors\": [{\"code\": \"10009\", ...}]}`) rather than the single-`error` shape below., 403: The authenticated credential is not permitted to perform this operation., 404: Not Found, 429: Authentication is temporarily overloaded. Retry after the number of seconds in `Retry-After`., 500: Internal Server Error, 503: Authentication is temporarily unavailable.}\n\n@endpoint GET /meeting_sessions/{id}/events\n@desc List meeting session events\n@required {id: str # Unique identifier for the meeting session.}\n@optional {after: int=0 # Return results with a cursor position after this value., limit: int=100 # Maximum number of results to return per page.}\n@returns(200) {data: [map]} # Successful response with a list of meeting session events.\n@errors {400: Bad Request, 401: Unauthorized. On api.telnyx.com, authentication is enforced by the API gateway before the request reaches the Meeting service, so a missing or invalid API key returns the standard Telnyx error envelope (`{\"errors\": [{\"code\": \"10009\", ...}]}`) rather than the single-`error` shape below., 403: The authenticated credential is not permitted to perform this operation., 404: Not Found, 429: Authentication is temporarily overloaded. Retry after the number of seconds in `Retry-After`., 500: Internal Server Error, 503: Authentication is temporarily unavailable.}\n\n@endpoint DELETE /meeting_sessions/{id}/recording_media\n@desc Delete meeting session recording media\n@required {id: str # Unique identifier for the meeting session.}\n@returns(202) {data: map{meeting_session_id: str, provider: str, scope: str, deletion_status: str}} # The irreversible recording-media deletion request was accepted, or a deletion is already in progress.\n@errors {401: Unauthorized. On api.telnyx.com, authentication is enforced by the API gateway before the request reaches the Meeting service, so a missing or invalid API key returns the standard Telnyx error envelope (`{\"errors\": [{\"code\": \"10009\", ...}]}`) rather than the single-`error` shape below., 403: The authenticated credential is not permitted to perform this operation., 404: The meeting session does not exist or belongs to another account., 409: Provider recording media cannot be deleted while the meeting is in progress., 422: The session's provider does not support recording-media deletion, or does not match the configured provider., 429: Authentication is temporarily overloaded. Retry after the number of seconds in `Retry-After`., 500: Internal Server Error, 502: The provider request failed and the recording-media deletion outcome is unknown., 503: The authentication service is unavailable.}\n\n@endpoint GET /meeting_sessions/{id}/recordings\n@desc List meeting session recordings\n@required {id: str # Unique identifier for the meeting session.}\n@returns(200) {data: [map]} # Successful response with a list of meeting session recordings.\n@errors {401: Unauthorized. On api.telnyx.com, authentication is enforced by the API gateway before the request reaches the Meeting service, so a missing or invalid API key returns the standard Telnyx error envelope (`{\"errors\": [{\"code\": \"10009\", ...}]}`) rather than the single-`error` shape below., 403: The authenticated credential is not permitted to perform this operation., 404: Not Found, 429: Authentication is temporarily overloaded. Retry after the number of seconds in `Retry-After`., 500: Internal Server Error, 502: The provider failed to return recording entries., 503: Authentication is temporarily unavailable.}\n\n@endpoint GET /meeting_sessions/{id}/transcript\n@desc List meeting session transcript\n@required {id: str # Unique identifier for the meeting session.}\n@optional {after: int=0 # Return results with a cursor position after this value., limit: int=100 # Maximum number of results to return per page., wait_seconds: int=0 # Long-poll duration in seconds. The server holds the connection open for up to this many seconds, waiting for new or updated results before returning an empty response. Set to 0 for an immediate response.}\n@returns(200) {data: [map], meta: map{next_after: int?}} # Successful response with transcript segments (may be empty on wait timeout).\n@errors {400: Bad Request, 401: Unauthorized. On api.telnyx.com, authentication is enforced by the API gateway before the request reaches the Meeting service, so a missing or invalid API key returns the standard Telnyx error envelope (`{\"errors\": [{\"code\": \"10009\", ...}]}`) rather than the single-`error` shape below., 403: The authenticated credential is not permitted to perform this operation., 404: Not Found, 429: Authentication is temporarily overloaded. Retry after the number of seconds in `Retry-After`., 500: Internal Server Error, 503: Authentication is temporarily unavailable.}\n\n@endgroup\n\n@group messages\n@endpoint POST /messages\n@desc Send a message\n@required {to: str # Receiving address (+E.164 formatted phone number or short code).}\n@optional {from: str # Sending address (+E.164 formatted phone number, alphanumeric sender ID, or short code).  **Required if sending with a phone number, short code, or alphanumeric sender ID.**, messaging_profile_id: str # Unique identifier for a messaging profile.  **Required if sending via number pool or with an alphanumeric sender ID.**, text: str # Message body (i.e., content) as a non-empty string.  **Required for SMS**, subject: str # Subject of multimedia message, media_urls: [str(url)] # A list of media URLs. The total media size must be less than 1 MB.  **Required for MMS**, webhook_url: str(url) # The URL where webhooks related to this message will be sent., webhook_failover_url: str(url) # The failover URL where webhooks related to this message will be sent if sending to the primary URL fails., use_profile_webhooks: bool=true # If the profile this number is associated with has webhooks, use them for delivery notifications. If webhooks are also specified on the message itself, they will be attempted first, then those on the profile., type: str(SMS/MMS) # The protocol for sending the message, either SMS or MMS., auto_detect: bool=false # Automatically detect if an SMS message is unusually long and exceeds a recommended limit of message parts., send_at: str(date-time) # ISO 8601 formatted date indicating when to send the message - accurate up till a minute., encoding: str(auto/gsm7/ucs2)=auto # Encoding to use for the message. `auto` (default) uses smart encoding to automatically select the most efficient encoding. `gsm7` forces GSM-7 encoding (returns 400 if message contains characters that cannot be encoded). `ucs2` forces UCS-2 encoding and disables smart encoding. When set, this overrides the messaging profile's `smart_encoding` setting.}\n@returns(200) {data: map{record_type: str, direction: str, id: str(uuid), type: str, messaging_profile_id: str, organization_id: str(uuid), from: map{phone_number: str, carrier: str, line_type: str, agent_id: str, agent_name: str}, to: [map], cc: [map], text: str, num_chars: int, subject: str?, media: [map], webhook_url: str(url)?, webhook_failover_url: str(url)?, encoding: str, parts: int, tags: [str], cost: map?, cost_breakdown: map?, tcr_campaign_id: str?, tcr_campaign_billable: bool, tcr_campaign_registered: str?, received_at: str(date-time), sent_at: str(date-time)?, completed_at: str(date-time)?, valid_until: str(date-time)?, errors: [any], smart_encoding_applied: bool, wait_seconds: num(float)?, body: map{text: str}}} # Successful response with details about a message.\n@errors {4XX: Unexpected error}\n\n@endpoint POST /messages/alphanumeric/sender/id\n@desc Send a message using an alphanumeric sender ID\n@required {from: str # A valid alphanumeric sender ID on the user's account., to: str # Receiving address (+E.164 formatted phone number or short code)., text: str # The message body., messaging_profile_id: str(uuid) # The messaging profile ID to use.}\n@optional {webhook_url: str(url) # Callback URL for delivery status updates., webhook_failover_url: str(url) # Failover callback URL for delivery status updates., use_profile_webhooks: bool # If true, use the messaging profile's webhook settings.}\n@returns(200) {data: map{record_type: str, direction: str, id: str(uuid), type: str, messaging_profile_id: str, organization_id: str(uuid), from: map{phone_number: str, carrier: str, line_type: str}, to: [map], cc: [map], text: str, num_chars: int, subject: str?, media: [map], webhook_url: str(url)?, webhook_failover_url: str(url)?, encoding: str, parts: int, tags: [str], cost: map?, cost_breakdown: map?, tcr_campaign_id: str?, tcr_campaign_billable: bool, tcr_campaign_registered: str?, received_at: str(date-time), sent_at: str(date-time)?, completed_at: str(date-time)?, valid_until: str(date-time)?, errors: [any], smart_encoding_applied: bool, wait_seconds: num(float)?}} # Successful response with the sent message.\n@errors {400: Bad Request, 401: Unauthorized, 422: Unprocessable Entity}\n\n@endpoint POST /messages/alphanumeric_sender_id\n@desc Send a message using an alphanumeric sender ID\n@required {from: str # A valid alphanumeric sender ID on the user's account., to: str # Receiving address (+E.164 formatted phone number or short code)., text: str # The message body., messaging_profile_id: str(uuid) # The messaging profile ID to use.}\n@optional {webhook_url: str(url) # Callback URL for delivery status updates., webhook_failover_url: str(url) # Failover callback URL for delivery status updates., use_profile_webhooks: bool # If true, use the messaging profile's webhook settings.}\n@returns(200) {data: map{record_type: str, direction: str, id: str(uuid), type: str, messaging_profile_id: str, organization_id: str(uuid), from: map{phone_number: str, carrier: str, line_type: str, agent_id: str, agent_name: str}, to: [map], cc: [map], text: str, num_chars: int, subject: str?, media: [map], webhook_url: str(url)?, webhook_failover_url: str(url)?, encoding: str, parts: int, tags: [str], cost: map?, cost_breakdown: map?, tcr_campaign_id: str?, tcr_campaign_billable: bool, tcr_campaign_registered: str?, received_at: str(date-time), sent_at: str(date-time)?, completed_at: str(date-time)?, valid_until: str(date-time)?, errors: [any], smart_encoding_applied: bool, wait_seconds: num(float)?, body: map{text: str}}} # Successful response with the sent message.\n@errors {400: Bad Request, 401: Unauthorized, 422: Unprocessable Entity}\n\n@endpoint GET /messages/group/{message_id}\n@desc Retrieve group MMS messages\n@required {message_id: str(uuid) # The group message ID.}\n@returns(200) {data: [map]} # Successful response with group MMS messages.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint POST /messages/group_mms\n@desc Send a group MMS message\n@required {from: str # Phone number, in +E.164 format, used to send the message., to: [str] # A list of destinations. No more than 8 destinations are allowed.}\n@optional {text: str # Message body (i.e., content) as a non-empty string., subject: str # Subject of multimedia message, media_urls: [str(url)] # A list of media URLs. The total media size must be less than 1 MB., webhook_url: str(url) # The URL where webhooks related to this message will be sent., webhook_failover_url: str(url) # The failover URL where webhooks related to this message will be sent if sending to the primary URL fails., use_profile_webhooks: bool=true # If the profile this number is associated with has webhooks, use them for delivery notifications. If webhooks are also specified on the message itself, they will be attempted first, then those on the profile.}\n@returns(200) {data: map{record_type: str, direction: str, id: str(uuid), type: str, messaging_profile_id: str, organization_id: str(uuid), from: map{phone_number: str, carrier: str, line_type: str, agent_id: str, agent_name: str}, to: [map], cc: [map], text: str, num_chars: int, subject: str?, media: [map], webhook_url: str(url)?, webhook_failover_url: str(url)?, encoding: str, parts: int, tags: [str], cost: map?, cost_breakdown: map?, tcr_campaign_id: str?, tcr_campaign_billable: bool, tcr_campaign_registered: str?, received_at: str(date-time), sent_at: str(date-time)?, completed_at: str(date-time)?, valid_until: str(date-time)?, errors: [any], smart_encoding_applied: bool, wait_seconds: num(float)?, body: map{text: str}}} # Successful response with details about a message.\n@errors {4XX: Unexpected error}\n\n@endpoint POST /messages/long_code\n@desc Send a long code message\n@required {from: str # Phone number, in +E.164 format, used to send the message., to: str # Receiving address (+E.164 formatted phone number or short code).}\n@optional {text: str # Message body (i.e., content) as a non-empty string.  **Required for SMS**, subject: str # Subject of multimedia message, media_urls: [str(url)] # A list of media URLs. The total media size must be less than 1 MB.  **Required for MMS**, webhook_url: str(url) # The URL where webhooks related to this message will be sent., webhook_failover_url: str(url) # The failover URL where webhooks related to this message will be sent if sending to the primary URL fails., use_profile_webhooks: bool=true # If the profile this number is associated with has webhooks, use them for delivery notifications. If webhooks are also specified on the message itself, they will be attempted first, then those on the profile., type: str(SMS/MMS) # The protocol for sending the message, either SMS or MMS., auto_detect: bool=false # Automatically detect if an SMS message is unusually long and exceeds a recommended limit of message parts., encoding: str(auto/gsm7/ucs2)=auto # Encoding to use for the message. `auto` (default) uses smart encoding to automatically select the most efficient encoding. `gsm7` forces GSM-7 encoding (returns 400 if message contains characters that cannot be encoded). `ucs2` forces UCS-2 encoding and disables smart encoding. When set, this overrides the messaging profile's `smart_encoding` setting.}\n@returns(200) {data: map{record_type: str, direction: str, id: str(uuid), type: str, messaging_profile_id: str, organization_id: str(uuid), from: map{phone_number: str, carrier: str, line_type: str, agent_id: str, agent_name: str}, to: [map], cc: [map], text: str, num_chars: int, subject: str?, media: [map], webhook_url: str(url)?, webhook_failover_url: str(url)?, encoding: str, parts: int, tags: [str], cost: map?, cost_breakdown: map?, tcr_campaign_id: str?, tcr_campaign_billable: bool, tcr_campaign_registered: str?, received_at: str(date-time), sent_at: str(date-time)?, completed_at: str(date-time)?, valid_until: str(date-time)?, errors: [any], smart_encoding_applied: bool, wait_seconds: num(float)?, body: map{text: str}}} # Successful response with details about a message.\n@errors {4XX: Unexpected error}\n\n@endpoint POST /messages/number_pool\n@desc Send a message using number pool\n@required {messaging_profile_id: str # Unique identifier for a messaging profile., to: str # Receiving address (+E.164 formatted phone number or short code).}\n@optional {text: str # Message body (i.e., content) as a non-empty string.  **Required for SMS**, subject: str # Subject of multimedia message, media_urls: [str(url)] # A list of media URLs. The total media size must be less than 1 MB.  **Required for MMS**, webhook_url: str(url) # The URL where webhooks related to this message will be sent., webhook_failover_url: str(url) # The failover URL where webhooks related to this message will be sent if sending to the primary URL fails., use_profile_webhooks: bool=true # If the profile this number is associated with has webhooks, use them for delivery notifications. If webhooks are also specified on the message itself, they will be attempted first, then those on the profile., type: str(SMS/MMS) # The protocol for sending the message, either SMS or MMS., auto_detect: bool=false # Automatically detect if an SMS message is unusually long and exceeds a recommended limit of message parts., encoding: str(auto/gsm7/ucs2)=auto # Encoding to use for the message. `auto` (default) uses smart encoding to automatically select the most efficient encoding. `gsm7` forces GSM-7 encoding (returns 400 if message contains characters that cannot be encoded). `ucs2` forces UCS-2 encoding and disables smart encoding. When set, this overrides the messaging profile's `smart_encoding` setting.}\n@returns(200) {data: map{record_type: str, direction: str, id: str(uuid), type: str, messaging_profile_id: str, organization_id: str(uuid), from: map{phone_number: str, carrier: str, line_type: str, agent_id: str, agent_name: str}, to: [map], cc: [map], text: str, num_chars: int, subject: str?, media: [map], webhook_url: str(url)?, webhook_failover_url: str(url)?, encoding: str, parts: int, tags: [str], cost: map?, cost_breakdown: map?, tcr_campaign_id: str?, tcr_campaign_billable: bool, tcr_campaign_registered: str?, received_at: str(date-time), sent_at: str(date-time)?, completed_at: str(date-time)?, valid_until: str(date-time)?, errors: [any], smart_encoding_applied: bool, wait_seconds: num(float)?, body: map{text: str}}} # Successful response with details about a message.\n@errors {4XX: Unexpected error}\n\n@endpoint POST /messages/rcs\n@desc Send an RCS message\n@required {agent_id: str # RCS Agent ID, to: str # Phone number in +E.164 format, messaging_profile_id: str # A valid messaging profile ID, agent_message: map{content_message: map, event: map, expire_time: str(date-time), ttl: str}}\n@optional {type: str # Message type - must be set to \"RCS\", webhook_url: str(url) # The URL where webhooks related to this message will be sent., sms_fallback: map{from: str, text: str}, mms_fallback: map{from: str, subject: str, media_urls: [str], text: str}}\n@returns(200) {data: map{record_type: str, direction: str, id: str, type: str, organization_id: str, messaging_profile_id: str, from: map{agent_id: str, carrier: str, agent_name: str}, to: [map], body: map{content_message: map{suggestions: [map], text: str, rich_card: map, content_info: map}, event: map{event_type: str}, expire_time: str(date-time), ttl: str}, encoding: str, received_at: str(date-time), wait_seconds: num(float)?}} # Successful operation\n@errors {4XX: Unexpected error}\n\n@endpoint GET /messages/rcs/deeplinks/{agent_id}\n@desc Generate RCS deeplink\n@required {agent_id: str # RCS agent ID}\n@optional {phone_number: str # Phone number in E164 format (URL encoded), body: str # Pre-filled message body (URL encoded)}\n@returns(200) {data: map{url: str}} # Successful response with deeplink URL\n@errors {4XX: Unexpected error}\n\n@endpoint GET /messages/rcs_deeplinks/{agent_id}\n@desc Generate RCS deeplink\n@required {agent_id: str # RCS agent ID}\n@optional {phone_number: str # Phone number in E164 format (URL encoded), body: str # Pre-filled message body (URL encoded)}\n@returns(200) {data: map{url: str}} # Successful response with deeplink URL\n@errors {4XX: Unexpected error}\n\n@endpoint POST /messages/schedule\n@desc Schedule a message\n@required {to: str # Receiving address (+E.164 formatted phone number or short code).}\n@optional {from: str # Sending address (+E.164 formatted phone number, alphanumeric sender ID, or short code).  **Required if sending with a phone number, short code, or alphanumeric sender ID.**, messaging_profile_id: str # Unique identifier for a messaging profile.  **Required if sending via number pool or with an alphanumeric sender ID.**, text: str # Message body (i.e., content) as a non-empty string.  **Required for SMS**, subject: str # Subject of multimedia message, media_urls: [str(url)] # A list of media URLs. The total media size must be less than 1 MB.  **Required for MMS**, webhook_url: str(url) # The URL where webhooks related to this message will be sent., webhook_failover_url: str(url) # The failover URL where webhooks related to this message will be sent if sending to the primary URL fails., use_profile_webhooks: bool=true # If the profile this number is associated with has webhooks, use them for delivery notifications. If webhooks are also specified on the message itself, they will be attempted first, then those on the profile., type: str(SMS/MMS) # The protocol for sending the message, either SMS or MMS., auto_detect: bool=false # Automatically detect if an SMS message is unusually long and exceeds a recommended limit of message parts., send_at: str(date-time) # ISO 8601 formatted date indicating when to send the message - accurate up till a minute.}\n@returns(200) {data: map{record_type: str, direction: str, id: str(uuid), type: str, messaging_profile_id: str, organization_id: str(uuid), from: map{phone_number: str, carrier: str, line_type: str, agent_id: str, agent_name: str}, to: [map], cc: [map], text: str, num_chars: int, subject: str?, media: [map], webhook_url: str(url)?, webhook_failover_url: str(url)?, encoding: str, parts: int, tags: [str], cost: map?, cost_breakdown: map?, tcr_campaign_id: str?, tcr_campaign_billable: bool, tcr_campaign_registered: str?, received_at: str(date-time), sent_at: str(date-time)?, completed_at: str(date-time)?, valid_until: str(date-time)?, errors: [any], smart_encoding_applied: bool, wait_seconds: num(float)?, body: map{text: str}}} # Successful response with details about a message.\n@errors {4XX: Unexpected error}\n\n@endpoint POST /messages/short_code\n@desc Send a short code message\n@required {from: str # Phone number, in +E.164 format, used to send the message., to: str # Receiving address (+E.164 formatted phone number or short code).}\n@optional {text: str # Message body (i.e., content) as a non-empty string.  **Required for SMS**, subject: str # Subject of multimedia message, media_urls: [str(url)] # A list of media URLs. The total media size must be less than 1 MB.  **Required for MMS**, webhook_url: str(url) # The URL where webhooks related to this message will be sent., webhook_failover_url: str(url) # The failover URL where webhooks related to this message will be sent if sending to the primary URL fails., use_profile_webhooks: bool=true # If the profile this number is associated with has webhooks, use them for delivery notifications. If webhooks are also specified on the message itself, they will be attempted first, then those on the profile., type: str(SMS/MMS) # The protocol for sending the message, either SMS or MMS., auto_detect: bool=false # Automatically detect if an SMS message is unusually long and exceeds a recommended limit of message parts., encoding: str(auto/gsm7/ucs2)=auto # Encoding to use for the message. `auto` (default) uses smart encoding to automatically select the most efficient encoding. `gsm7` forces GSM-7 encoding (returns 400 if message contains characters that cannot be encoded). `ucs2` forces UCS-2 encoding and disables smart encoding. When set, this overrides the messaging profile's `smart_encoding` setting.}\n@returns(200) {data: map{record_type: str, direction: str, id: str(uuid), type: str, messaging_profile_id: str, organization_id: str(uuid), from: map{phone_number: str, carrier: str, line_type: str, agent_id: str, agent_name: str}, to: [map], cc: [map], text: str, num_chars: int, subject: str?, media: [map], webhook_url: str(url)?, webhook_failover_url: str(url)?, encoding: str, parts: int, tags: [str], cost: map?, cost_breakdown: map?, tcr_campaign_id: str?, tcr_campaign_billable: bool, tcr_campaign_registered: str?, received_at: str(date-time), sent_at: str(date-time)?, completed_at: str(date-time)?, valid_until: str(date-time)?, errors: [any], smart_encoding_applied: bool, wait_seconds: num(float)?, body: map{text: str}}} # Successful response with details about a message.\n@errors {4XX: Unexpected error}\n\n@endpoint POST /messages/whatsapp\n@desc Send a Whatsapp message\n@required {from: str # Phone number in +E.164 format associated with Whatsapp account, to: str # Phone number in +E.164 format, whatsapp_message: map{audio: map, document: map, image: map, sticker: map, video: map, interactive: map, location: map, contacts: [map], reaction: map, biz_opaque_callback_data: str, type: str, text: map, template: map}}\n@optional {type: str # Message type - must be set to \"WHATSAPP\", webhook_url: str(url) # The URL where webhooks related to this message will be sent., messaging_profile_id: str(uuid) # Messaging profile ID - required if the 'from' number is not SMS-enabled}\n@returns(200) {data: map{record_type: str, direction: str, id: str, type: str, organization_id: str, messaging_profile_id: str, from: map{phone_number: str, status: str, carrier: str, line_type: str}, to: [map], body: map{audio: map{link: str(url), caption: str, filename: str, voice: bool}, document: map{link: str(url), caption: str, filename: str, voice: bool}, image: map{link: str(url), caption: str, filename: str, voice: bool}, sticker: map{link: str(url), caption: str, filename: str, voice: bool}, video: map{link: str(url), caption: str, filename: str, voice: bool}, interactive: map{type: str, action: map, body: map, footer: map, header: map}, location: map{latitude: str, longitude: str, name: str, address: str}, contacts: [map], reaction: map{message_id: str, emoji: str}, biz_opaque_callback_data: str, type: str, text: map{body: str, preview_url: bool}, template: map{template_id: str, name: str, language: map, components: [map]}}, encoding: str, received_at: str(date-time), wait_seconds: num(float)?}} # Successful operation\n@errors {4XX: Unexpected error}\n\n@endpoint DELETE /messages/{id}\n@desc Cancel a scheduled message\n@required {id: str(uuid) # The id of the message to cancel}\n@returns(200) {record_type: str, direction: str, id: str(uuid), type: str, messaging_profile_id: str, organization_id: str(uuid), from: map{phone_number: str, carrier: str, line_type: str}, to: [map], cc: [map], text: str, num_chars: int, subject: str?, media: [map], webhook_url: str(url)?, webhook_failover_url: str(url)?, encoding: str, parts: int, tags: [str], cost: map?, cost_breakdown: map?, tcr_campaign_id: str?, tcr_campaign_billable: bool, tcr_campaign_registered: str?, received_at: str(date-time), sent_at: str(date-time)?, completed_at: str(date-time)?, valid_until: str(date-time)?, errors: [any], smart_encoding_applied: bool} # Successful response\n@errors {403: Forbidden, 404: Not found., 4XX: Unexpected error}\n\n@endpoint GET /messages/{id}\n@desc Retrieve a message\n@required {id: str(uuid) # The id of the message}\n@returns(200) {data: any} # Successful response with details of a message.\n@errors {4XX: Unexpected error}\n\n@endgroup\n\n@group messaging\n@endpoint GET /messaging/hosted/numbers\n@desc List messaging hosted numbers\n@optional {filter[messaging_profile_id]: str(uuid): any # Filter by messaging profile ID., filter[phone_number]: str # Filter by exact phone number., filter[phone_number][contains]: str # Filter by phone number substring., sort[phone_number]: str(asc/desc) # Sort by phone number., page[number]: int=1 # Page number to retrieve (1-based)., page[size]: int=20 # Number of items to return per page.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of hosted numbers.\n@errors {401: Unauthorized}\n\n@endpoint POST /messaging/profiles/{id}/actions/regenerate/secret\n@desc Regenerate messaging profile secret\n@required {id: str(uuid) # The identifier of the messaging profile.}\n@returns(200) {data: map{record_type: str, id: str(uuid), mms_fall_back_to_sms: bool, mms_transcoding: bool, name: str, enabled: bool, webhook_url: str(url)?, webhook_failover_url: str(url)?, webhook_api_version: str, health_webhook_url: str(url)?, whitelisted_destinations: [str], created_at: str(date-time), updated_at: str(date-time), v1_secret: str, number_pool_settings: map?, url_shortener_settings: map?, alpha_sender: str?, daily_spend_limit: str, daily_spend_limit_enabled: bool, redaction_enabled: bool, redaction_level: int, mobile_only: bool, smart_encoding: bool, organization_id: str, ai_assistant_id: str?, resource_group_id: str?}} # Successful response with details about a messaging profile.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint GET /messaging/profiles/{id}/alphanumeric/sender/ids\n@desc List alphanumeric sender IDs for a messaging profile\n@required {id: str(uuid) # The identifier of the messaging profile.}\n@optional {page[number]: int=1: any # Page number to retrieve (1-based)., page[size]: int=20 # Number of items to return per page.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of alphanumeric sender IDs.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint GET /messaging/profiles/{id}/metrics\n@desc Get detailed messaging profile metrics\n@required {id: str(uuid) # The identifier of the messaging profile.}\n@optional {time_frame: str # The time frame for metrics.}\n@returns(200) {data: map} # Successful response with detailed profile metrics.\n@errors {400: Bad Request, 401: Unauthorized, 404: Not Found}\n\n@endpoint GET /messaging/rcs/agents\n@desc List all RCS agents\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful reponse with the list of RCS agents\n@errors {4XX: Unexpected error}\n\n@endpoint GET /messaging/rcs/agents/{id}\n@desc Retrieve an RCS agent\n@required {id: str # RCS agent ID}\n@returns(200) {data: map{agent_id: str, user_id: str, profile_id: str(uuid)?, webhook_url: str(url)?, webhook_failover_url: str(url)?, agent_name: str, enabled: bool, created_at: str(date-time), updated_at: str(date-time)}} # Successful response with the RCS agent\n@errors {4XX: Unexpected error}\n\n@endpoint PATCH /messaging/rcs/agents/{id}\n@desc Modify an RCS agent\n@required {id: str # RCS agent ID}\n@optional {profile_id: str(uuid) # Messaging profile ID associated with the RCS Agent, webhook_url: str(url) # URL to receive RCS events, webhook_failover_url: str(url) # Failover URL to receive RCS events}\n@returns(200) {data: map{agent_id: str, user_id: str, profile_id: str(uuid)?, webhook_url: str(url)?, webhook_failover_url: str(url)?, agent_name: str, enabled: bool, created_at: str(date-time), updated_at: str(date-time)}} # Successful response with the updated RCS agent\n@errors {4XX: Unexpected error}\n\n@endpoint POST /messaging/rcs/bulk_capabilities\n@desc Check RCS capabilities (batch)\n@required {agent_id: str # RCS Agent ID, phone_numbers: [str] # List of phone numbers to check}\n@returns(200) {data: [map]} # Successful response\n@errors {4XX: Unexpected error}\n\n@endpoint GET /messaging/rcs/capabilities/{agent_id}/{phone_number}\n@desc Check RCS capabilities\n@required {agent_id: str # RCS agent ID, phone_number: str # Phone number in E164 format}\n@returns(200) {data: map{record_type: str, phone_number: str, agent_id: str, agent_name: str, features: [str]}} # Successful response\n@errors {4XX: Unexpected error}\n\n@endpoint PUT /messaging/rcs/test_number_invite/{id}/{phone_number}\n@desc Add RCS test number\n@required {id: str # RCS agent ID, phone_number: str # Phone number in E164 format to invite for testing}\n@returns(200) {data: map{record_type: str, agent_id: str, phone_number: str, status: str}} # Test number successfully invited to RCS agent\n@errors {4XX: Unexpected error}\n\n@endpoint GET /messaging/tollfree/verification/requests/{id}/status/history\n@desc Get Verification Request Status History\n@required {id: str(uuid) # Unique identifier of the resource., page[number]: int # Page number to retrieve (1-based)., page[size]: int # Number of items to return per page.}\n@returns(200) {records: [map], total_records: int} # Successful Response\n@errors {4XX: Generic error response}\n\n@endgroup\n\n@group messaging_hosted_number_orders\n@endpoint GET /messaging_hosted_number_orders\n@desc List messaging hosted number orders\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of messaging hosted number orders.\n@errors {4XX: Unexpected error}\n\n@endpoint POST /messaging_hosted_number_orders\n@desc Create a messaging hosted number order\n@optional {phone_numbers: [str] # Phone numbers to be used for hosted messaging., messaging_profile_id: str # Automatically associate the number with this messaging profile ID when the order is complete.}\n@returns(200) {data: map{record_type: str, id: str(uuid), messaging_profile_id: str?, status: str, phone_numbers: [map]}} # Successful response with details about a messaging hosted number order.\n@errors {4XX: Unexpected error}\n\n@endpoint POST /messaging_hosted_number_orders/eligibility_numbers_check\n@desc Check hosted messaging eligibility\n@required {phone_numbers: [str] # List of phone numbers to check eligibility}\n@returns(200) {phone_numbers: [map]} # Successful response\n@errors {400: Bad request, 401: Unauthorized}\n@example_request {\"phone_numbers\":[\"string\"]}\n\n@endpoint DELETE /messaging_hosted_number_orders/{id}\n@desc Delete a messaging hosted number order\n@required {id: str # Identifies the messaging hosted number order to delete.}\n@returns(200) {data: map{record_type: str, id: str(uuid), messaging_profile_id: str?, status: str, phone_numbers: [map]}} # Successful response with details about a messaging hosted number order.\n@errors {4XX: Unexpected error}\n\n@endpoint GET /messaging_hosted_number_orders/{id}\n@desc Retrieve a messaging hosted number order\n@required {id: str # Identifies the type of resource.}\n@returns(200) {data: map{record_type: str, id: str(uuid), messaging_profile_id: str?, status: str, phone_numbers: [map]}} # Successful response with details about a messaging hosted number order.\n@errors {4XX: Unexpected error}\n\n@endpoint POST /messaging_hosted_number_orders/{id}/actions/file_upload\n@desc Upload hosted number document\n@required {id: str # Identifies the type of resource.}\n@returns(200) {data: map{record_type: str, id: str(uuid), messaging_profile_id: str?, status: str, phone_numbers: [map]}} # Successful response with details about a messaging hosted number order.\n@errors {4XX: Unexpected error}\n\n@endpoint POST /messaging_hosted_number_orders/{id}/validation_codes\n@desc Validate hosted number codes\n@required {id: str # Order ID related to the validation codes., verification_codes: [map{phone_number!: str, code!: str}]}\n@returns(200) {data: map{phone_numbers: [map], order_id: str(uuid)}} # Successful response with the phone numbers and their respective status of the validation codes.\n@errors {4XX: Unexpected error}\n@example_request {\"verification_codes\":[{\"phone_number\":\"string\",\"code\":\"string\"}]}\n\n@endpoint POST /messaging_hosted_number_orders/{id}/verification_codes\n@desc Create hosted number verification codes\n@required {id: str # Order ID to have a verification code created., phone_numbers: [str], verification_method: str(sms/call)}\n@returns(200) {data: [map]} # Verification codes created and sent to the phone numbers of the hosted order.\n@errors {4XX: Unexpected error}\n@example_request {\"phone_numbers\":[\"string\"],\"verification_method\":\"sms\"}\n\n@endgroup\n\n@group messaging_hosted_numbers\n@endpoint GET /messaging_hosted_numbers\n@desc List messaging hosted numbers\n@optional {filter[messaging_profile_id]: str(uuid): any # Filter by messaging profile ID., filter[phone_number]: str # Filter by exact phone number., filter[phone_number][contains]: str # Filter by phone number substring., sort[phone_number]: str(asc/desc) # Sort by phone number., page[number]: int=1 # Page number to retrieve (1-based)., page[size]: int=20 # Number of items to return per page.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of hosted numbers.\n@errors {401: Unauthorized}\n\n@endpoint DELETE /messaging_hosted_numbers/{id}\n@desc Delete a messaging hosted number\n@required {id: str # Identifies the type of resource.}\n@returns(200) {data: map{record_type: str, id: str(uuid), messaging_profile_id: str?, status: str, phone_numbers: [map]}} # Successful response with details about a messaging hosted number order.\n@errors {4XX: Unexpected error}\n\n@endpoint GET /messaging_hosted_numbers/{id}\n@desc Retrieve a messaging hosted number\n@required {id: str # The ID or phone number of the hosted number.}\n@returns(200) {data: map{record_type: str, id: str, phone_number: str, messaging_profile_id: str?, created_at: str(date-time), updated_at: str(date-time), country_code: str, type: str, health: map{message_count: int, inbound_outbound_ratio: num(float), success_ratio: num(float), spam_ratio: num(float)}, eligible_messaging_products: [str], traffic_type: str, messaging_product: str, features: map{sms: map?, mms: map?}, organization_id: str, tags: [str]}} # Successful response with a hosted number.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint PATCH /messaging_hosted_numbers/{id}\n@desc Update a messaging hosted number\n@required {id: str # The ID or phone number of the hosted number.}\n@optional {messaging_profile_id: str # Configure the messaging profile this phone number is assigned to:  * Omit this field or set its value to `null` to keep the current value. * Set this field to `\"\"` to unassign the number from its messaging profile * Set this field to a quoted UUID of a messaging profile to assign this number to that messaging profile, messaging_product: str # Configure the messaging product for this number:  * Omit this field or set its value to `null` to keep the current value. * Set this field to a quoted product ID to set this phone number to that product, tags: [str] # Tags to set on this phone number.}\n@returns(200) {data: map{record_type: str, id: str, phone_number: str, messaging_profile_id: str?, created_at: str(date-time), updated_at: str(date-time), country_code: str, type: str, health: map{message_count: int, inbound_outbound_ratio: num(float), success_ratio: num(float), spam_ratio: num(float)}, eligible_messaging_products: [str], traffic_type: str, messaging_product: str, features: map{sms: map?, mms: map?}, organization_id: str, tags: [str]}} # Successful response with the updated hosted number.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endgroup\n\n@group messaging_numbers\n@endpoint POST /messaging_numbers/bulk_updates\n@desc Bulk update phone number profiles\n@required {messaging_profile_id: str # Configure the messaging profile these phone numbers are assigned to:  * Set this field to `\"\"` to unassign each number from their respective messaging profile * Set this field to a quoted UUID of a messaging profile to assign these numbers to that messaging profile, numbers: [str] # The list of phone numbers to update.}\n@optional {assign_only: bool=false # If true, only assign numbers to the profile without changing other settings.}\n@returns(200) {data: map{record_type: str, order_id: str(uuid), success: [str], pending: [str], failed: [str]}} # Successful response with details about messaging bulk update phone numbers.\n@errors {4XX: Unexpected error}\n\n@endpoint GET /messaging_numbers/bulk_updates/{order_id}\n@desc Retrieve bulk update status\n@required {order_id: str # Order ID to verify bulk update status.}\n@returns(200) {data: map{record_type: str, order_id: str(uuid), success: [str], pending: [str], failed: [str]}} # Successful response with details about messaging bulk update phone numbers.\n@errors {4XX: Unexpected error}\n\n@endgroup\n\n@group messaging_numbers_bulk_updates\n@endpoint POST /messaging_numbers_bulk_updates\n@desc Bulk update phone number profiles\n@required {messaging_profile_id: str # Configure the messaging profile these phone numbers are assigned to:  * Set this field to `\"\"` to unassign each number from their respective messaging profile * Set this field to a quoted UUID of a messaging profile to assign these numbers to that messaging profile, numbers: [str] # The list of phone numbers to update.}\n@optional {assign_only: bool=false # If true, only assign numbers to the profile without changing other settings.}\n@returns(200) {data: map{record_type: str, order_id: str(uuid), success: [str], pending: [str], failed: [str]}} # Successful response with details about messaging bulk update phone numbers.\n@errors {4XX: Unexpected error}\n\n@endpoint GET /messaging_numbers_bulk_updates/{order_id}\n@desc Retrieve bulk update status\n@required {order_id: str # Order ID to verify bulk update status.}\n@returns(200) {data: map{record_type: str, order_id: str(uuid), success: [str], pending: [str], failed: [str]}} # Successful response with details about messaging bulk update phone numbers.\n@errors {4XX: Unexpected error}\n\n@endgroup\n\n@group messaging_optouts\n@endpoint GET /messaging_optouts\n@desc List opt-outs\n@optional {redaction_enabled: str # If receiving address (+E.164 formatted phone number) should be redacted, filter: map # Consolidated filter parameter (deepObject style). Originally: filter[messaging_profile_id], filter[from], page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size], created_at: map # Consolidated created_at parameter (deepObject style). Originally: created_at[gte], created_at[lte]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with opt-out list data\n@errors {400: Bad request, 401: Unauthorized}\n\n@endgroup\n\n@group messaging_profile_metrics\n@endpoint GET /messaging_profile_metrics\n@desc List high-level messaging profile metrics\n@optional {time_frame: str # The time frame for metrics.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with high-level profile metrics.\n@errors {400: Bad Request, 401: Unauthorized}\n\n@endgroup\n\n@group messaging_profiles\n@endpoint GET /messaging_profiles\n@desc List messaging profiles\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[name], page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size], filter[name][eq]: str # Filter profiles by exact name match., filter[name][contains]: str # Filter profiles by name containing the given string.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of messaging profiles.\n@errors {4XX: Unexpected error}\n\n@endpoint POST /messaging_profiles\n@desc Create a messaging profile\n@required {name: str # A user friendly name for the messaging profile., whitelisted_destinations: [str] # Destinations to which the messaging profile is allowed to send. The elements in the list must be valid ISO 3166-1 alpha-2 country codes. If set to `[\"*\"]` all destinations will be allowed.}\n@optional {enabled: bool=true # Specifies whether the messaging profile is enabled or not., webhook_url: str(url)= # The URL where webhooks related to this messaging profile will be sent., webhook_failover_url: str(url)= # The failover URL where webhooks related to this messaging profile will be sent if sending to the primary URL fails., webhook_api_version: str(1/2/2010-04-01)=2 # Determines which webhook format will be used, Telnyx API v1, v2, or a legacy 2010-04-01 format., number_pool_settings: map{toll_free_weight!: num, long_code_weight!: num, skip_unhealthy!: bool, sticky_sender: bool, geomatch: bool} # Number Pool allows you to send messages from a pool of numbers of different types, assigning weights to each type. The pool consists of all the long code and toll free numbers assigned to the messaging profile.  To disable this feature, set the object field to `null`., url_shortener_settings: map{domain!: str, prefix: str, replace_blacklist_only: bool, send_webhooks: bool} # The URL shortener feature allows automatic replacement of URLs that were generated using a public URL shortener service. Some examples include bit.do, bit.ly, goo.gl, ht.ly, is.gd, ow.ly, rebrand.ly, t.co, tiny.cc, and tinyurl.com. Such URLs are replaced with with links generated by Telnyx. The use of custom links can improve branding and message deliverability.  To disable this feature, set the object field to `null`., alpha_sender: str # The alphanumeric sender ID to use when sending to destinations that require an alphanumeric sender ID., daily_spend_limit: str # The maximum amount of money (in USD) that can be spent by this profile before midnight UTC., daily_spend_limit_enabled: bool # Whether to enforce the value configured by `daily_spend_limit`., mms_fall_back_to_sms: bool=false # enables SMS fallback for MMS messages., mms_transcoding: bool=false # enables automated resizing of MMS media., mobile_only: bool=false # Send messages only to mobile phone numbers., smart_encoding: bool=false # Enables automatic character encoding optimization for SMS messages. When enabled, the system automatically selects the most efficient encoding (GSM-7 or UCS-2) based on message content to maximize character limits and minimize costs., features: map{ai_opt_out_detection_enabled: bool} # Telnyx product features the messaging customer can enable on the messaging profile. Keys map to individual feature flags; unknown keys are accepted and preserved for forward compatibility with rolling deployments., resource_group_id: str # The resource group ID to associate with this messaging profile., health_webhook_url: str(url) # A URL to receive health check webhooks for numbers in this profile., ai_assistant_id: str # The AI assistant ID to associate with this messaging profile.}\n@returns(200) {data: map{record_type: str, id: str(uuid), mms_fall_back_to_sms: bool, mms_transcoding: bool, name: str, enabled: bool, webhook_url: str(url)?, webhook_failover_url: str(url)?, webhook_api_version: str, health_webhook_url: str(url)?, whitelisted_destinations: [str], created_at: str(date-time), updated_at: str(date-time), v1_secret: str, number_pool_settings: map?, url_shortener_settings: map?, alpha_sender: str?, daily_spend_limit: str, daily_spend_limit_enabled: bool, redaction_enabled: bool, redaction_level: int, mobile_only: bool, smart_encoding: bool, features: map?, organization_id: str, ai_assistant_id: str?, resource_group_id: str?}} # Successful response with details about a messaging profile.\n@errors {4XX: Unexpected error}\n\n@endpoint DELETE /messaging_profiles/{id}\n@desc Delete a messaging profile\n@required {id: str(uuid) # The id of the messaging profile to retrieve}\n@returns(200) {data: map{record_type: str, id: str(uuid), mms_fall_back_to_sms: bool, mms_transcoding: bool, name: str, enabled: bool, webhook_url: str(url)?, webhook_failover_url: str(url)?, webhook_api_version: str, health_webhook_url: str(url)?, whitelisted_destinations: [str], created_at: str(date-time), updated_at: str(date-time), v1_secret: str, number_pool_settings: map?, url_shortener_settings: map?, alpha_sender: str?, daily_spend_limit: str, daily_spend_limit_enabled: bool, redaction_enabled: bool, redaction_level: int, mobile_only: bool, smart_encoding: bool, features: map?, organization_id: str, ai_assistant_id: str?, resource_group_id: str?}} # Successful response with details about a messaging profile.\n@errors {4XX: Unexpected error}\n\n@endpoint GET /messaging_profiles/{id}\n@desc Retrieve a messaging profile\n@required {id: str(uuid) # The id of the messaging profile to retrieve}\n@returns(200) {data: map{record_type: str, id: str(uuid), mms_fall_back_to_sms: bool, mms_transcoding: bool, name: str, enabled: bool, webhook_url: str(url)?, webhook_failover_url: str(url)?, webhook_api_version: str, health_webhook_url: str(url)?, whitelisted_destinations: [str], created_at: str(date-time), updated_at: str(date-time), v1_secret: str, number_pool_settings: map?, url_shortener_settings: map?, alpha_sender: str?, daily_spend_limit: str, daily_spend_limit_enabled: bool, redaction_enabled: bool, redaction_level: int, mobile_only: bool, smart_encoding: bool, features: map?, organization_id: str, ai_assistant_id: str?, resource_group_id: str?}} # Successful response with details about a messaging profile.\n@errors {4XX: Unexpected error}\n\n@endpoint PATCH /messaging_profiles/{id}\n@desc Update a messaging profile\n@required {id: str(uuid) # The id of the messaging profile to retrieve}\n@optional {record_type: str # Identifies the type of the resource., id: str(uuid) # Identifies the type of resource., name: str # A user friendly name for the messaging profile., enabled: bool # Specifies whether the messaging profile is enabled or not., webhook_url: str(url) # The URL where webhooks related to this messaging profile will be sent., webhook_failover_url: str(url) # The failover URL where webhooks related to this messaging profile will be sent if sending to the primary URL fails., webhook_api_version: str(1/2/2010-04-01) # Determines which webhook format will be used, Telnyx API v1, v2, or a legacy 2010-04-01 format., whitelisted_destinations: [str] # Destinations to which the messaging profile is allowed to send. The elements in the list must be valid ISO 3166-1 alpha-2 country codes. If set to `[\"*\"]`, all destinations will be allowed.  This field is required if the messaging profile doesn't have it defined yet., created_at: str(date-time) # ISO 8601 formatted date indicating when the resource was created., updated_at: str(date-time) # ISO 8601 formatted date indicating when the resource was updated., v1_secret: str # Secret used to authenticate with v1 endpoints., number_pool_settings: map{toll_free_weight!: num, long_code_weight!: num, skip_unhealthy!: bool, sticky_sender: bool, geomatch: bool} # Number Pool allows you to send messages from a pool of numbers of different types, assigning weights to each type. The pool consists of all the long code and toll free numbers assigned to the messaging profile.  To disable this feature, set the object field to `null`., url_shortener_settings: map{domain!: str, prefix: str, replace_blacklist_only: bool, send_webhooks: bool} # The URL shortener feature allows automatic replacement of URLs that were generated using a public URL shortener service. Some examples include bit.do, bit.ly, goo.gl, ht.ly, is.gd, ow.ly, rebrand.ly, t.co, tiny.cc, and tinyurl.com. Such URLs are replaced with with links generated by Telnyx. The use of custom links can improve branding and message deliverability.  To disable this feature, set the object field to `null`., alpha_sender: str # The alphanumeric sender ID to use when sending to destinations that require an alphanumeric sender ID., daily_spend_limit: str # The maximum amount of money (in USD) that can be spent by this profile before midnight UTC., daily_spend_limit_enabled: bool # Whether to enforce the value configured by `daily_spend_limit`., mms_fall_back_to_sms: bool=false # enables SMS fallback for MMS messages., mms_transcoding: bool=false # enables automated resizing of MMS media., mobile_only: bool=false # Send messages only to mobile phone numbers., smart_encoding: bool=false # Enables automatic character encoding optimization for SMS messages. When enabled, the system automatically selects the most efficient encoding (GSM-7 or UCS-2) based on message content to maximize character limits and minimize costs., features: map{ai_opt_out_detection_enabled: bool} # Telnyx product features the messaging customer can enable on the messaging profile. Keys map to individual feature flags; unknown keys are accepted and preserved for forward compatibility with rolling deployments., ai_assistant_id: str # The ID of the AI assistant associated with this messaging profile., redaction_enabled: bool=false # Set to true to enable message content redaction on this profile, or false to disable it. Ignored if the organization is not on the redaction allowlist. See the [Message Redaction guide](/docs/messaging/messages/message-redaction) for what is redacted., redaction_level: int=2 # The redaction level to apply when redaction is enabled. 1: redact message records and reporting only. 2 (default): also redact inbound webhook payloads. See the [Message Redaction guide](/docs/messaging/messages/message-redaction).}\n@returns(200) {data: map{record_type: str, id: str(uuid), mms_fall_back_to_sms: bool, mms_transcoding: bool, name: str, enabled: bool, webhook_url: str(url)?, webhook_failover_url: str(url)?, webhook_api_version: str, health_webhook_url: str(url)?, whitelisted_destinations: [str], created_at: str(date-time), updated_at: str(date-time), v1_secret: str, number_pool_settings: map?, url_shortener_settings: map?, alpha_sender: str?, daily_spend_limit: str, daily_spend_limit_enabled: bool, redaction_enabled: bool, redaction_level: int, mobile_only: bool, smart_encoding: bool, features: map?, organization_id: str, ai_assistant_id: str?, resource_group_id: str?}} # Successful response with details about a messaging profile.\n@errors {4XX: Unexpected error}\n\n@endpoint POST /messaging_profiles/{id}/actions/regenerate_secret\n@desc Regenerate messaging profile secret\n@required {id: str(uuid) # The identifier of the messaging profile.}\n@returns(200) {data: map{record_type: str, id: str(uuid), mms_fall_back_to_sms: bool, mms_transcoding: bool, name: str, enabled: bool, webhook_url: str(url)?, webhook_failover_url: str(url)?, webhook_api_version: str, health_webhook_url: str(url)?, whitelisted_destinations: [str], created_at: str(date-time), updated_at: str(date-time), v1_secret: str, number_pool_settings: map?, url_shortener_settings: map?, alpha_sender: str?, daily_spend_limit: str, daily_spend_limit_enabled: bool, redaction_enabled: bool, redaction_level: int, mobile_only: bool, smart_encoding: bool, features: map?, organization_id: str, ai_assistant_id: str?, resource_group_id: str?}} # Successful response with details about a messaging profile.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint GET /messaging_profiles/{id}/alphanumeric_sender_ids\n@desc List alphanumeric sender IDs for a messaging profile\n@required {id: str(uuid) # The identifier of the messaging profile.}\n@optional {page[number]: int=1: any # Page number to retrieve (1-based)., page[size]: int=20 # Number of items to return per page.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of alphanumeric sender IDs.\n@errors {401: Unauthorized, 404: Not Found}\n\n@endpoint GET /messaging_profiles/{id}/metrics\n@desc Get detailed messaging profile metrics\n@required {id: str(uuid) # The identifier of the messaging profile.}\n@optional {time_frame: str # The time frame for metrics.}\n@returns(200) {data: map} # Successful response with detailed profile metrics.\n@errors {400: Bad Request, 401: Unauthorized, 404: Not Found}\n\n@endpoint GET /messaging_profiles/{id}/phone_numbers\n@desc List phone numbers associated with a messaging profile\n@required {id: str(uuid) # The id of the messaging profile to retrieve}\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of messaging profile phone numbers.\n@errors {4XX: Unexpected error}\n\n@endpoint GET /messaging_profiles/{id}/short_codes\n@desc List short codes associated with a messaging profile\n@required {id: str(uuid) # The id of the messaging profile to retrieve}\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of messaging profile short codes.\n@errors {4XX: Unexpected error}\n\n@endpoint GET /messaging_profiles/{profile_id}/autoresp_configs\n@desc List Auto-Response Settings\n@required {profile_id: str(uuid) # Unique identifier of the profile.}\n@optional {country_code: str # Filter results by country code., created_at: map # Consolidated created_at parameter (deepObject style). Originally: created_at[gte], created_at[lte], updated_at: map # Consolidated updated_at parameter (deepObject style). Originally: updated_at[gte], updated_at[lte]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {4XX: Unexpected error}\n\n@endpoint POST /messaging_profiles/{profile_id}/autoresp_configs\n@desc Create auto-response setting\n@required {profile_id: str # Unique identifier of the profile., op: str(start/stop/info), keywords: [str], country_code: str}\n@optional {resp_text: str}\n@returns(200) {data: map{op: str, keywords: [str], resp_text: str, country_code: str, id: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful Response\n@errors {4XX: Unexpected error}\n\n@endpoint DELETE /messaging_profiles/{profile_id}/autoresp_configs/{autoresp_cfg_id}\n@desc Delete Auto-Response Setting\n@required {profile_id: str(uuid) # Unique identifier of the profile., autoresp_cfg_id: str(uuid) # Unique identifier of the autoresp cfg.}\n@returns(200) Successful Response\n@errors {4XX: Unexpected error}\n\n@endpoint GET /messaging_profiles/{profile_id}/autoresp_configs/{autoresp_cfg_id}\n@desc Get Auto-Response Setting\n@required {profile_id: str(uuid) # Unique identifier of the profile., autoresp_cfg_id: str(uuid) # Unique identifier of the autoresp cfg.}\n@returns(200) {data: map{op: str, keywords: [str], resp_text: str, country_code: str, id: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful Response\n@errors {4XX: Unexpected error}\n\n@endpoint PUT /messaging_profiles/{profile_id}/autoresp_configs/{autoresp_cfg_id}\n@desc Update Auto-Response Setting\n@required {profile_id: str(uuid) # Unique identifier of the profile., autoresp_cfg_id: str(uuid) # Unique identifier of the autoresp cfg., op: str(start/stop/info), keywords: [str], country_code: str}\n@optional {resp_text: str}\n@returns(200) {data: map{op: str, keywords: [str], resp_text: str, country_code: str, id: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful Response\n@errors {4XX: Unexpected error}\n\n@endgroup\n\n@group messaging_tollfree\n@endpoint GET /messaging_tollfree/verification/requests\n@desc List Verification Requests\n@required {page: int # Page number to retrieve (1-based)., page_size: int # Request this many records per page          This value is automatically clamped if the provided value is too large.}\n@optional {date_start: str(date-time) # Start of the date range filter (inclusive, ISO 8601)., date_end: str(date-time) # End of the date range filter (inclusive, ISO 8601)., status: str # Filter results by status., phone_number: str # Filter results by phone number., business_name: str # Filter verification requests by business name}\n@returns(200) {records: [map], total_records: int} # Successful Response\n@errors {4XX: Generic error response}\n\n@endpoint POST /messaging_tollfree/verification/requests\n@desc Submit Verification Request\n@required {businessName: str # Name of the business; there are no specific formatting requirements, corporateWebsite: str # A URL, including the scheme, pointing to the corporate website, businessAddr1: str # Line 1 of the business address, businessCity: str # The city of the business address; the first letter should be capitalized, businessState: str # The full name of the state (not the 2 letter code) of the business address; the first letter should be capitalized, businessZip: str # The ZIP code of the business address, businessContactFirstName: str # First name of the business contact; there are no specific requirements on formatting, businessContactLastName: str # Last name of the business contact; there are no specific requirements on formatting, businessContactEmail: str # The email address of the business contact, businessContactPhone: str # The phone number of the business contact in E.164 format, messageVolume: any # Estimated monthly volume of messages from the given phone numbers, phoneNumbers: [map{phoneNumber!: str}] # The phone numbers to request the verification of, useCase: any # Machine-readable use-case for the phone numbers, useCaseSummary: str # Human-readable summary of the desired use-case, productionMessageContent: str # An example of a message that will be sent from the given phone numbers, optInWorkflow: str # Human-readable description of how end users will opt into receiving messages from the given phone numbers, optInWorkflowImageURLs: [map{url!: str(uri)}] # Images showing the opt-in workflow, additionalInformation: str # Any additional information}\n@optional {businessAddr2: str # Line 2 of the business address, isvReseller: str # ISV name, webhookUrl: str # URL that should receive webhooks relating to this verification request, businessRegistrationNumber: str # Official business registration number (e.g., Employer Identification Number (EIN) in the U.S.). Required from January 2026., businessRegistrationType: str # Type of business registration being provided. Required from January 2026., businessRegistrationCountry: str # ISO 3166-1 alpha-2 country code of the issuing business authority. Must be exactly 2 letters. Automatically converted to uppercase. Required from January 2026., doingBusinessAs: str # Doing Business As (DBA) name if different from legal name, entityType: any # Business entity classification. Must be one of the 5 valid enum values., optInConfirmationResponse: str # Message sent to users confirming their opt-in to receive messages, helpMessageResponse: str # The message returned when users text 'HELP', privacyPolicyURL: str # URL pointing to the business's privacy policy. Plain string, no URL format validation., termsAndConditionURL: str # URL pointing to the business's terms and conditions. Plain string, no URL format validation., ageGatedContent: bool=false # Indicates if messaging content requires age gating (e.g., 18+). Defaults to false if not provided., optInKeywords: str # Keywords used to collect and process consumer opt-ins, campaignVerifyAuthorizationToken: str # Campaign Verify Authorization Token required for Political use case submissions starting February 17, 2026. This token is validated by Zipwhip and must be provided for all Political use case verifications after the deadline.}\n@returns(200) {businessName: str, corporateWebsite: str, businessAddr1: str, businessAddr2: str, businessCity: str, businessState: str, businessZip: str, businessContactFirstName: str, businessContactLastName: str, businessContactEmail: str, businessContactPhone: str, messageVolume: any, phoneNumbers: [map], useCase: any, useCaseSummary: str, productionMessageContent: str, optInWorkflow: str, optInWorkflowImageURLs: [map], additionalInformation: str, isvReseller: str, webhookUrl: str, businessRegistrationNumber: str, businessRegistrationType: str, businessRegistrationCountry: str, doingBusinessAs: str, entityType: any, optInConfirmationResponse: str, helpMessageResponse: str, privacyPolicyURL: str, termsAndConditionURL: str, ageGatedContent: bool, optInKeywords: str, campaignVerifyAuthorizationToken: str?, id: str(uuid), verificationRequestId: str, verificationStatus: any} # Successful Response\n@errors {4XX: Generic error response}\n\n@endpoint DELETE /messaging_tollfree/verification/requests/{id}\n@desc Delete Verification Request\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) Successful deleted\n@errors {404: Generic error response, 4XX: Generic error response}\n\n@endpoint GET /messaging_tollfree/verification/requests/{id}\n@desc Get Verification Request\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {businessName: str, corporateWebsite: str, businessAddr1: str, businessAddr2: str, businessCity: str, businessState: str, businessZip: str, businessContactFirstName: str, businessContactLastName: str, businessContactEmail: str, businessContactPhone: str, messageVolume: any, phoneNumbers: [map], useCase: any, useCaseSummary: str, productionMessageContent: str, optInWorkflow: str, optInWorkflowImageURLs: [map], additionalInformation: str, isvReseller: str, webhookUrl: str, businessRegistrationNumber: str, businessRegistrationType: str, businessRegistrationCountry: str, doingBusinessAs: str, entityType: any, optInConfirmationResponse: str, helpMessageResponse: str, privacyPolicyURL: str, termsAndConditionURL: str, ageGatedContent: bool, optInKeywords: str, campaignVerifyAuthorizationToken: str?, id: str(uuid), verificationStatus: any, reason: str, createdAt: str(date-time), updatedAt: str(date-time)} # Successful Response\n@errors {4XX: Generic error response}\n\n@endpoint PATCH /messaging_tollfree/verification/requests/{id}\n@desc Update Verification Request\n@required {id: str(uuid) # Unique identifier of the resource., businessName: str # Name of the business; there are no specific formatting requirements, corporateWebsite: str # A URL, including the scheme, pointing to the corporate website, businessAddr1: str # Line 1 of the business address, businessCity: str # The city of the business address; the first letter should be capitalized, businessState: str # The full name of the state (not the 2 letter code) of the business address; the first letter should be capitalized, businessZip: str # The ZIP code of the business address, businessContactFirstName: str # First name of the business contact; there are no specific requirements on formatting, businessContactLastName: str # Last name of the business contact; there are no specific requirements on formatting, businessContactEmail: str # The email address of the business contact, businessContactPhone: str # The phone number of the business contact in E.164 format, messageVolume: any # Estimated monthly volume of messages from the given phone numbers, phoneNumbers: [map{phoneNumber!: str}] # The phone numbers to request the verification of, useCase: any # Machine-readable use-case for the phone numbers, useCaseSummary: str # Human-readable summary of the desired use-case, productionMessageContent: str # An example of a message that will be sent from the given phone numbers, optInWorkflow: str # Human-readable description of how end users will opt into receiving messages from the given phone numbers, optInWorkflowImageURLs: [map{url!: str(uri)}] # Images showing the opt-in workflow, additionalInformation: str # Any additional information}\n@optional {businessAddr2: str # Line 2 of the business address, isvReseller: str # ISV name, webhookUrl: str # URL that should receive webhooks relating to this verification request, businessRegistrationNumber: str # Official business registration number (e.g., Employer Identification Number (EIN) in the U.S.). Required from January 2026., businessRegistrationType: str # Type of business registration being provided. Required from January 2026., businessRegistrationCountry: str # ISO 3166-1 alpha-2 country code of the issuing business authority. Must be exactly 2 letters. Automatically converted to uppercase. Required from January 2026., doingBusinessAs: str # Doing Business As (DBA) name if different from legal name, entityType: any # Business entity classification. Must be one of the 5 valid enum values., optInConfirmationResponse: str # Message sent to users confirming their opt-in to receive messages, helpMessageResponse: str # The message returned when users text 'HELP', privacyPolicyURL: str # URL pointing to the business's privacy policy. Plain string, no URL format validation., termsAndConditionURL: str # URL pointing to the business's terms and conditions. Plain string, no URL format validation., ageGatedContent: bool=false # Indicates if messaging content requires age gating (e.g., 18+). Defaults to false if not provided., optInKeywords: str # Keywords used to collect and process consumer opt-ins, campaignVerifyAuthorizationToken: str # Campaign Verify Authorization Token required for Political use case submissions starting February 17, 2026. This token is validated by Zipwhip and must be provided for all Political use case verifications after the deadline.}\n@returns(200) {businessName: str, corporateWebsite: str, businessAddr1: str, businessAddr2: str, businessCity: str, businessState: str, businessZip: str, businessContactFirstName: str, businessContactLastName: str, businessContactEmail: str, businessContactPhone: str, messageVolume: any, phoneNumbers: [map], useCase: any, useCaseSummary: str, productionMessageContent: str, optInWorkflow: str, optInWorkflowImageURLs: [map], additionalInformation: str, isvReseller: str, webhookUrl: str, businessRegistrationNumber: str, businessRegistrationType: str, businessRegistrationCountry: str, doingBusinessAs: str, entityType: any, optInConfirmationResponse: str, helpMessageResponse: str, privacyPolicyURL: str, termsAndConditionURL: str, ageGatedContent: bool, optInKeywords: str, campaignVerifyAuthorizationToken: str?, id: str(uuid), verificationRequestId: str, verificationStatus: any} # Successful Response\n@errors {4XX: Generic error response}\n\n@endpoint GET /messaging_tollfree/verification/requests/{id}/status_history\n@desc Get Verification Request Status History\n@required {id: str(uuid) # Unique identifier of the resource., page[number]: int # Page number to retrieve (1-based)., page[size]: int # Number of items to return per page.}\n@returns(200) {records: [map], total_records: int} # Successful Response\n@errors {4XX: Generic error response}\n\n@endgroup\n\n@group messaging_url_domains\n@endpoint GET /messaging_url_domains\n@desc List messaging URL domains\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with details about a messaging URL domain.\n@errors {4XX: Unexpected error}\n\n@endgroup\n\n@group mobile_network_operators\n@endpoint GET /mobile_network_operators\n@desc List mobile network operators\n@optional {filter: map # Consolidated filter parameter for mobile network operators (deepObject style). Originally: filter[name][starts_with], filter[name][contains], filter[name][ends_with], filter[country_code], filter[mcc], filter[mnc], filter[tadig], filter[network_preferences_enabled], page: map # Consolidated pagination parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {401: Unauthorized}\n\n@endgroup\n\n@group mobile_phone_numbers\n@endpoint GET /mobile_phone_numbers/messaging\n@desc List mobile phone numbers with messaging settings\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of mobile phone numbers with messaging settings.\n@errors {4XX: Unexpected error}\n\n@endpoint GET /mobile_phone_numbers/{id}/messaging\n@desc Retrieve a mobile phone number with messaging settings\n@required {id: str # Identifies the type of resource.}\n@returns(200) {data: map{record_type: str, id: str, phone_number: str, messaging_profile_id: str?, created_at: str(date-time), updated_at: str(date-time), country_code: str, type: str, traffic_type: str, messaging_product: str, features: map{sms: map?}, organization_id: str, tags: [str]}} # Successful response with details about a mobile phone number.\n@errors {4XX: Unexpected error}\n\n@endgroup\n\n@group mobile_push_credentials\n@endpoint GET /mobile_push_credentials\n@desc List mobile push credentials\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[type], filter[alias]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Mobile mobile push credentials\n@errors {401: Unauthorized request}\n\n@endpoint POST /mobile_push_credentials\n@desc Creates a new mobile push credential\n@returns(200) {data: map{id: str, certificate: str, private_key: str, project_account_json_file: map, alias: str, type: str, record_type: str, created_at: str(date-time), updated_at: str(date-time)}} # Mobile push credential created\n@errors {401: Unauthorized request, 422: Unable to process request}\n\n@endpoint DELETE /mobile_push_credentials/{push_credential_id}\n@desc Deletes a mobile push credential\n@required {push_credential_id: str(uuid) # The unique identifier of a mobile push credential}\n@returns(204) The mobile push credential was deleted successfully\n@errors {401: Unauthorized request, 404: Resource not found, 422: Unable to process request}\n\n@endpoint GET /mobile_push_credentials/{push_credential_id}\n@desc Retrieves a mobile push credential\n@required {push_credential_id: str(uuid) # The unique identifier of a mobile push credential}\n@returns(200) {data: map{id: str, certificate: str, private_key: str, project_account_json_file: map, alias: str, type: str, record_type: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful get mobile push credential response\n@errors {401: Unauthorized request, 404: Resource not found, 422: Unable to process request}\n\n@endgroup\n\n@group network_coverage\n@endpoint GET /network_coverage\n@desc List network coverage locations\n@optional {filters: map # Consolidated filters parameter (deepObject style). Originally: filters[available_services][contains], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[location.region], filter[location.site], filter[location.pop], filter[location.code], page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unexpected error}\n\n@endgroup\n\n@group networks\n@endpoint GET /networks\n@desc List all Networks\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[name], page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [any], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint POST /networks\n@desc Create a Network\n@returns(200) {data: any} # Successful response\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint DELETE /networks/{id}\n@desc Delete a Network\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint GET /networks/{id}\n@desc Retrieve a Network\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint PATCH /networks/{id}\n@desc Update a Network\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint DELETE /networks/{id}/default_gateway\n@desc Delete Default Gateway.\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: [any], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint GET /networks/{id}/default_gateway\n@desc Get Default Gateway status.\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: [any], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint POST /networks/{id}/default_gateway\n@desc Create Default Gateway.\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: [any], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint GET /networks/{id}/network_interfaces\n@desc List all Interfaces for a Network.\n@required {id: str(uuid) # Identifies the resource.}\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[name], filter[type], filter[status], page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [any], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unexpected error}\n\n@endgroup\n\n@group noise_suppression_engines\n@endpoint GET /noise_suppression_engines\n@desc List available noise suppression engines\n@returns(200) {data: [map]} # A list of noise suppression engines available to the authenticated user\n@errors {401: Unauthorized — the request did not carry valid Telnyx API credentials}\n\n@endgroup\n\n@group notification_channels\n@endpoint GET /notification_channels\n@desc List notification channels\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[associated_record_type][eq], filter[channel_type_id][eq], filter[notification_profile_id][eq], filter[notification_channel][eq], filter[notification_event_condition_id][eq], filter[status][eq]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Returns a list of notification channels.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint POST /notification_channels\n@desc Create a notification channel\n@optional {id: str # A UUID., notification_profile_id: str # A UUID reference to the associated Notification Profile., channel_type_id: str(sms/voice/email/webhook) # A Channel Type ID, channel_destination: str # The destination associated with the channel type., created_at: str(date-time) # ISO 8601 formatted date indicating when the resource was created., updated_at: str(date-time) # ISO 8601 formatted date indicating when the resource was updated.}\n@returns(200) {data: map{id: str, notification_profile_id: str, channel_type_id: str, channel_destination: str, created_at: str(date-time), updated_at: str(date-time)}} # A Notification Channel response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint DELETE /notification_channels/{id}\n@desc Delete a notification channel\n@required {id: str(uuid) # The id of the resource.}\n@returns(200) {data: map{id: str, notification_profile_id: str, channel_type_id: str, channel_destination: str, created_at: str(date-time), updated_at: str(date-time)}} # A Notification Channel response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /notification_channels/{id}\n@desc Get a notification channel\n@required {id: str(uuid) # The id of the resource.}\n@returns(200) {data: map{id: str, notification_profile_id: str, channel_type_id: str, channel_destination: str, created_at: str(date-time), updated_at: str(date-time)}} # A Notification Channel response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint PATCH /notification_channels/{id}\n@desc Update a notification channel\n@required {id: str(uuid) # The id of the resource.}\n@optional {id: str # A UUID., notification_profile_id: str # A UUID reference to the associated Notification Profile., channel_type_id: str(sms/voice/email/webhook) # A Channel Type ID, channel_destination: str # The destination associated with the channel type., created_at: str(date-time) # ISO 8601 formatted date indicating when the resource was created., updated_at: str(date-time) # ISO 8601 formatted date indicating when the resource was updated.}\n@returns(200) {data: map{id: str, notification_profile_id: str, channel_type_id: str, channel_destination: str, created_at: str(date-time), updated_at: str(date-time)}} # A Notification Channel response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group notification_event_conditions\n@endpoint GET /notification_event_conditions\n@desc List all Notifications Events Conditions\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[associated_record_type][eq], filter[channel_type_id][eq], filter[notification_profile_id][eq], filter[notification_channel][eq], filter[notification_event_condition_id][eq], filter[status][eq]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Returns a list of notification event conditions available.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group notification_events\n@endpoint GET /notification_events\n@desc List all Notifications Events\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Returns a list of notification events available.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group notification_profiles\n@endpoint GET /notification_profiles\n@desc List all Notifications Profiles\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Returns a list of notification profiles.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint POST /notification_profiles\n@desc Create a notification profile\n@optional {id: str # A UUID., name: str # A human readable name., created_at: str(date-time) # ISO 8601 formatted date indicating when the resource was created., updated_at: str(date-time) # ISO 8601 formatted date indicating when the resource was updated.}\n@returns(200) {data: map{id: str, name: str, created_at: str(date-time), updated_at: str(date-time)}} # A Notification Profile response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint DELETE /notification_profiles/{id}\n@desc Delete a notification profile\n@required {id: str(uuid) # The id of the resource.}\n@returns(200) {data: map{id: str, name: str, created_at: str(date-time), updated_at: str(date-time)}} # A Notification Profile response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /notification_profiles/{id}\n@desc Get a notification profile\n@required {id: str(uuid) # The id of the resource.}\n@returns(200) {data: map{id: str, name: str, created_at: str(date-time), updated_at: str(date-time)}} # A Notification Profile response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint PATCH /notification_profiles/{id}\n@desc Update a notification profile\n@required {id: str(uuid) # The id of the resource.}\n@optional {id: str # A UUID., name: str # A human readable name., created_at: str(date-time) # ISO 8601 formatted date indicating when the resource was created., updated_at: str(date-time) # ISO 8601 formatted date indicating when the resource was updated.}\n@returns(200) {data: map{id: str, name: str, created_at: str(date-time), updated_at: str(date-time)}} # A Notification Profile response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group notification_settings\n@endpoint GET /notification_settings\n@desc List notification settings\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[associated_record_type][eq], filter[channel_type_id][eq], filter[notification_profile_id][eq], filter[notification_channel][eq], filter[notification_event_condition_id][eq], filter[status][eq]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Returns a list of notification settings.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint POST /notification_settings\n@desc Add a Notification Setting\n@optional {id: str # A UUID., notification_event_condition_id: str # A UUID reference to the associated Notification Event Condition., notification_profile_id: str # A UUID reference to the associated Notification Profile., associated_record_type: str, associated_record_type_value: str, status: str(enabled/enable-received/enable-pending/enable-submtited/delete-received/delete-pending/delete-submitted/deleted) # Most preferences apply immediately; however, other may needs to propagate., notification_channel_id: str # A UUID reference to the associated Notification Channel., parameters: [map{name: str, value: str}], created_at: str(date-time) # ISO 8601 formatted date indicating when the resource was created., updated_at: str(date-time) # ISO 8601 formatted date indicating when the resource was updated.}\n@returns(200) {data: map{id: str, notification_event_condition_id: str, notification_profile_id: str, associated_record_type: str, associated_record_type_value: str, status: str, notification_channel_id: str, parameters: [map], created_at: str(date-time), updated_at: str(date-time)}} # A Notification Setting response\n@returns(201) {data: map{id: str, notification_event_condition_id: str, notification_profile_id: str, associated_record_type: str, associated_record_type_value: str, status: str, notification_channel_id: str, parameters: [map], created_at: str(date-time), updated_at: str(date-time)}} # A Notification Setting response - async\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint DELETE /notification_settings/{id}\n@desc Delete a notification setting\n@required {id: str(uuid) # The id of the resource.}\n@returns(200) {data: map{id: str, notification_event_condition_id: str, notification_profile_id: str, associated_record_type: str, associated_record_type_value: str, status: str, notification_channel_id: str, parameters: [map], created_at: str(date-time), updated_at: str(date-time)}} # A Notification Setting response\n@returns(201) {data: map{id: str, notification_event_condition_id: str, notification_profile_id: str, associated_record_type: str, associated_record_type_value: str, status: str, notification_channel_id: str, parameters: [map], created_at: str(date-time), updated_at: str(date-time)}} # A Notification Setting response - async\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /notification_settings/{id}\n@desc Get a notification setting\n@required {id: str(uuid) # The id of the resource.}\n@returns(200) {data: map{id: str, notification_event_condition_id: str, notification_profile_id: str, associated_record_type: str, associated_record_type_value: str, status: str, notification_channel_id: str, parameters: [map], created_at: str(date-time), updated_at: str(date-time)}} # A Notification Setting response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group number_block_orders\n@endpoint GET /number_block_orders\n@desc List number block orders\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[status], filter[created_at], filter[phone_numbers.starting_number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of number block orders.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint POST /number_block_orders\n@desc Create a number block order\n@required {starting_number: str # Starting phone number block, range: int # The phone number range included in the block.}\n@optional {id: str(uuid), record_type: str, phone_numbers_count: int # The count of phone numbers in the number order., connection_id: str # Identifies the connection associated with this phone number., messaging_profile_id: str # Identifies the messaging profile associated with the phone number., status: str(pending/success/failure) # The status of the order., customer_reference: str # A customer reference string for customer look ups., created_at: str(date-time) # An ISO 8901 datetime string denoting when the number order was created., updated_at: str(date-time) # An ISO 8901 datetime string for when the number order was updated., requirements_met: bool # True if all requirements are met for every phone number, false otherwise., errors: str # Errors the reservation could happen upon}\n@returns(200) {data: map{id: str(uuid), record_type: str, starting_number: str, range: int, phone_numbers_count: int, connection_id: str, messaging_profile_id: str, status: str, customer_reference: str, created_at: str(date-time), updated_at: str(date-time), requirements_met: bool}} # Successful response with details about a number block order.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /number_block_orders/{number_block_order_id}\n@desc Retrieve a number block order\n@required {number_block_order_id: str # The number block order ID.}\n@returns(200) {data: map{id: str(uuid), record_type: str, starting_number: str, range: int, phone_numbers_count: int, connection_id: str, messaging_profile_id: str, status: str, customer_reference: str, created_at: str(date-time), updated_at: str(date-time), requirements_met: bool}} # Successful response with details about a number block order.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group number_lookup\n@endpoint GET /number_lookup/{phone_number}\n@desc Lookup phone number data\n@required {phone_number: str # The phone number to be looked up}\n@optional {type: str(carrier/caller-name) # Specifies the type of number lookup to be performed}\n@returns(200) {data: map{record_type: str, country_code: str, national_format: str, phone_number: str, fraud: str?, carrier: map{mobile_country_code: str, mobile_network_code: str, name: str, type: str, error_code: str?, normalized_carrier: str}, caller_name: map{caller_name: str, error_code: str}, portability: map{lrn: str, ported_status: str, ported_date: str, ocn: str, line_type: str, spid: str, spid_carrier_name: str, spid_carrier_type: str, altspid: str, altspid_carrier_name: str, altspid_carrier_type: str, city: str, state: str}}} # Successful response\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endgroup\n\n@group number_order_phone_numbers\n@endpoint GET /number_order_phone_numbers\n@desc Retrieve a list of phone numbers associated to orders\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[country_code]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of number order phone numbers.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint POST /number_order_phone_numbers/{id}/requirement_group\n@desc Update requirement group for a phone number order\n@required {id: str(uuid) # The unique identifier of the number order phone number, requirement_group_id: str(uuid) # The ID of the requirement group to associate}\n@returns(200) {data: map{status: str, order_request_id: str(uuid), country_code: str, is_block_number: bool, regulatory_requirements: [map], locality: str, phone_number_type: str, bundle_id: str(uuid)?, sub_number_order_id: str(uuid), deadline: str(date-time), requirements_status: str, id: str(uuid), phone_number: str, requirements_met: bool, record_type: str}} # Successful response with updated phone number order details\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n@example_request {\"requirement_group_id\":\"a4b201f9-8646-4e54-a7d2-b2e403eeaf8c\"}\n\n@endpoint GET /number_order_phone_numbers/{number_order_phone_number_id}\n@desc Retrieve a single phone number within a number order.\n@required {number_order_phone_number_id: str # The number order phone number ID.}\n@returns(200) {data: map{id: str(uuid), record_type: str, phone_number: str, order_request_id: str(uuid), sub_number_order_id: str(uuid), country_code: str, phone_number_type: str, regulatory_requirements: [map], requirements_met: bool, status: str, bundle_id: str(uuid)?, locality: str, deadline: str(date-time), requirements_status: str, is_block_number: bool}} # Successful response with details about a number order phone number.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint PATCH /number_order_phone_numbers/{number_order_phone_number_id}\n@desc Update requirements for a single phone number within a number order.\n@required {number_order_phone_number_id: str # The number order phone number ID.}\n@optional {regulatory_requirements: [map{requirement_id: str(uuid), field_value: str}]}\n@returns(200) {data: map{id: str(uuid), record_type: str, phone_number: str, order_request_id: str(uuid), sub_number_order_id: str(uuid), country_code: str, phone_number_type: str, regulatory_requirements: [map], requirements_met: bool, status: str, bundle_id: str(uuid)?, locality: str, deadline: str(date-time), requirements_status: str, is_block_number: bool}} # Successful response with details about a number order phone number.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group number_orders\n@endpoint GET /number_orders\n@desc List number orders\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[status], filter[created_at], filter[phone_numbers_count], filter[customer_reference], filter[requirements_met]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of number orders.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint POST /number_orders\n@desc Create a number order\n@optional {phone_numbers: [map{phone_number!: str, requirement_group_id: str, bundle_id: str}], connection_id: str # Identifies the connection associated with this phone number., messaging_profile_id: str # Identifies the messaging profile associated with the phone number., billing_group_id: str # Identifies the billing group associated with the phone number., customer_reference: str # A customer reference string for customer look ups.}\n@returns(200) {data: map{id: str(uuid), record_type: str, phone_numbers_count: int, connection_id: str, messaging_profile_id: str, billing_group_id: str, phone_numbers: [map], sub_number_orders_ids: [str], status: str, customer_reference: str, created_at: str(date-time), updated_at: str(date-time), requirements_met: bool}} # Successful response with details about a number order.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /number_orders/{number_order_id}\n@desc Retrieve a number order\n@required {number_order_id: str # The number order ID.}\n@returns(200) {data: map{id: str(uuid), record_type: str, phone_numbers_count: int, connection_id: str, messaging_profile_id: str, billing_group_id: str, phone_numbers: [map], sub_number_orders_ids: [str], status: str, customer_reference: str, created_at: str(date-time), updated_at: str(date-time), requirements_met: bool}} # Successful response with details about a number order.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint PATCH /number_orders/{number_order_id}\n@desc Update a number order\n@required {number_order_id: str # The number order ID.}\n@optional {regulatory_requirements: [map{requirement_id: str(uuid), field_value: str}], customer_reference: str # A customer reference string for customer look ups.}\n@returns(200) {data: map{id: str(uuid), record_type: str, phone_numbers_count: int, connection_id: str, messaging_profile_id: str, billing_group_id: str, phone_numbers: [map], sub_number_orders_ids: [str], status: str, customer_reference: str, created_at: str(date-time), updated_at: str(date-time), requirements_met: bool}} # Successful response with details about a number order.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group number_reservations\n@endpoint GET /number_reservations\n@desc List number reservations\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[status], filter[created_at], filter[phone_numbers.phone_number], filter[customer_reference]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of number reservations.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint POST /number_reservations\n@desc Create a number reservation\n@optional {id: str(uuid), record_type: str, phone_numbers: [map{id: str(uuid), errors: str, record_type: str, phone_number: str, status: str, created_at: str(date-time), updated_at: str(date-time), expired_at: str(date-time)}], status: str(pending/success/failure) # The status of the entire reservation., customer_reference: str # A customer reference string for customer look ups., created_at: str(date-time) # An ISO 8901 datetime string denoting when the numbers reservation was created., updated_at: str(date-time) # An ISO 8901 datetime string for when the number reservation was updated.}\n@returns(200) {data: map{id: str(uuid), record_type: str, phone_numbers: [map], status: str, customer_reference: str, created_at: str(date-time), errors: str, updated_at: str(date-time)}} # Successful response with details about a number reservation.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /number_reservations/{number_reservation_id}\n@desc Retrieve a number reservation\n@required {number_reservation_id: str # The number reservation ID.}\n@returns(200) {data: map{id: str(uuid), record_type: str, phone_numbers: [map], status: str, customer_reference: str, created_at: str(date-time), errors: str, updated_at: str(date-time)}} # Successful response with details about a number reservation.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint POST /number_reservations/{number_reservation_id}/actions/extend\n@desc Extend a number reservation\n@required {number_reservation_id: str # The number reservation ID.}\n@returns(200) {data: map{id: str(uuid), record_type: str, phone_numbers: [map], status: str, customer_reference: str, created_at: str(date-time), errors: str, updated_at: str(date-time)}} # Successful response with details about a number reservation.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group numbers_features\n@endpoint POST /numbers_features\n@desc Retrieve the features for a list of numbers\n@required {phone_numbers: [str]}\n@returns(200) {data: [map]} # Successful response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n@example_request {\"phone_numbers\":[\"+19705555098\"]}\n\n@endgroup\n\n@group oauth\n@endpoint GET /oauth/authorize\n@desc OAuth authorization endpoint\n@required {response_type: str # OAuth response type, client_id: str # OAuth client identifier, redirect_uri: str(uri) # Redirect URI}\n@optional {scope: str # Space-separated list of requested scopes, state: str # State parameter for CSRF protection, code_challenge: str # PKCE code challenge, code_challenge_method: str(plain/S256) # PKCE code challenge method}\n@returns(200) Consent page displayed (when consent UI is embedded)\n@errors {302: Redirect to consent page or client with authorization code/error, 400: Invalid request, 404: Client not found, 422: Invalid redirect URI}\n\n@endpoint GET /oauth/clients\n@desc List OAuth clients\n@optional {page[size]: int=20: any # Number of results per page, page[number]: int=1 # Page number, filter[client_type]: str(confidential/public) # Filter by client type, filter[verified]: bool # Filter by verification status, filter[allowed_grant_types][contains]: str(client_credentials/authorization_code/refresh_token) # Filter by allowed grant type, filter[name]: str # Filter by exact client name, filter[name][contains]: str # Filter by client name containing text, filter[client_id]: str # Filter by client ID}\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_results: int, total_pages: int}} # List of OAuth clients\n@errors {401: Unauthorized}\n\n@endpoint POST /oauth/clients\n@desc Create OAuth client\n@required {name: str # The name of the OAuth client, allowed_scopes: [str] # List of allowed OAuth scopes, client_type: str(public/confidential) # OAuth client type, allowed_grant_types: [str] # List of allowed OAuth grant types}\n@optional {require_pkce: bool=false # Whether PKCE (Proof Key for Code Exchange) is required for this client, redirect_uris: [str(uri)]= # List of redirect URIs (required for authorization_code flow), logo_uri: str(uri) # URL of the client logo, policy_uri: str(uri) # URL of the client's privacy policy, tos_uri: str(uri) # URL of the client's terms of service}\n@returns(201) {data: map{record_type: str, client_id: str, name: str, org_id: str, user_id: str, allowed_scopes: [str], client_type: str, require_pkce: bool, allowed_grant_types: [str], redirect_uris: [str(uri)], logo_uri: str(uri)?, tos_uri: str(uri)?, policy_uri: str(uri)?, client_secret: str?, created_at: str(date-time), updated_at: str(date-time)}} # OAuth client created successfully\n@errors {400: Invalid request, 401: Unauthorized, 422: Validation error}\n\n@endpoint DELETE /oauth/clients/{id}\n@desc Delete OAuth client\n@required {id: str(uuid) # OAuth client ID}\n@returns(204) OAuth client deleted successfully\n@errors {404: OAuth client not found}\n\n@endpoint GET /oauth/clients/{id}\n@desc Get OAuth client\n@required {id: str(uuid) # OAuth client ID}\n@returns(200) {data: map{record_type: str, client_id: str, name: str, org_id: str, user_id: str, allowed_scopes: [str], client_type: str, require_pkce: bool, allowed_grant_types: [str], redirect_uris: [str(uri)], logo_uri: str(uri)?, tos_uri: str(uri)?, policy_uri: str(uri)?, client_secret: str?, created_at: str(date-time), updated_at: str(date-time)}} # OAuth client details\n@errors {404: OAuth client not found}\n\n@endpoint PUT /oauth/clients/{id}\n@desc Update OAuth client\n@required {id: str(uuid) # OAuth client ID}\n@optional {name: str # The name of the OAuth client, allowed_scopes: [str] # List of allowed OAuth scopes, require_pkce: bool # Whether PKCE (Proof Key for Code Exchange) is required for this client, allowed_grant_types: [str] # List of allowed OAuth grant types, redirect_uris: [str(uri)] # List of redirect URIs, logo_uri: str(uri) # URL of the client logo, policy_uri: str(uri) # URL of the client's privacy policy, tos_uri: str(uri) # URL of the client's terms of service}\n@returns(200) {data: map{record_type: str, client_id: str, name: str, org_id: str, user_id: str, allowed_scopes: [str], client_type: str, require_pkce: bool, allowed_grant_types: [str], redirect_uris: [str(uri)], logo_uri: str(uri)?, tos_uri: str(uri)?, policy_uri: str(uri)?, client_secret: str?, created_at: str(date-time), updated_at: str(date-time)}} # OAuth client updated successfully\n@errors {404: OAuth client not found, 422: Validation error}\n\n@endpoint GET /oauth/consent/{consent_token}\n@desc Get OAuth consent token\n@required {consent_token: str # OAuth consent token}\n@returns(200) {data: map{client_id: str, name: str, requested_scopes: [map], logo_uri: str(uri)?, tos_uri: str(uri)?, policy_uri: str(uri)?, redirect_uri: str(uri), verified: bool}} # Consent token details\n@errors {422: Invalid consent token}\n\n@endpoint GET /oauth/grants\n@desc List OAuth grants\n@optional {page[size]: int=20: any # Number of results per page, page[number]: int=1 # Page number}\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_results: int, total_pages: int}} # List of OAuth grants\n@errors {400: Bad Request, 401: Unauthorized}\n\n@endpoint POST /oauth/grants\n@desc Create OAuth grant\n@required {allowed: bool # Whether the grant is allowed, consent_token: str # Consent token}\n@returns(200) {redirect_uri: str(uri)} # Grant created successfully\n@errors {422: Invalid consent token}\n@example_request {\"allowed\":false,\"consent_token\":\"string\"}\n\n@endpoint DELETE /oauth/grants/{id}\n@desc Revoke OAuth grant\n@required {id: str(uuid) # OAuth grant ID}\n@returns(200) {data: map{id: str(uuid), record_type: str, client_id: str, scopes: [str], last_used_at: str(date-time)?, created_at: str(date-time)}} # OAuth grant revoked successfully\n@errors {404: OAuth grant not found}\n\n@endpoint GET /oauth/grants/{id}\n@desc Get OAuth grant\n@required {id: str(uuid) # OAuth grant ID}\n@returns(200) {data: map{id: str(uuid), record_type: str, client_id: str, scopes: [str], last_used_at: str(date-time)?, created_at: str(date-time)}} # OAuth grant details\n@errors {404: OAuth grant not found}\n\n@endpoint POST /oauth/introspect\n@desc Token introspection\n@required {token: str # The token to introspect}\n@returns(200) {active: bool, scope: str, client_id: str, exp: int, iat: int, iss: str, aud: str} # Introspection response\n@errors {400: Invalid request, 401: Invalid client credentials}\n@example_request {\"token\":\"string\"}\n\n@endpoint GET /oauth/jwks\n@desc JSON Web Key Set\n@returns(200) {keys: [map]} # JSON Web Key Set\n@errors {400: Bad Request, 401: Unauthorized}\n\n@endpoint POST /oauth/register\n@desc Dynamic client registration\n@optional {redirect_uris: [str(uri)] # Array of redirection URI strings for use in redirect-based flows, client_name: str # Human-readable string name of the client to be presented to the end-user, grant_types: [str]=authorization_code # Array of OAuth 2.0 grant type strings that the client may use, response_types: [str]=code # Array of the OAuth 2.0 response type strings that the client may use, scope: str # Space-separated string of scope values that the client may use, token_endpoint_auth_method: str(none/client_secret_basic/client_secret_post)=client_secret_basic # Authentication method for the token endpoint, logo_uri: str(uri) # URL of the client logo, tos_uri: str(uri) # URL of the client's terms of service, policy_uri: str(uri) # URL of the client's privacy policy}\n@returns(201) {client_id: str, client_secret: str, redirect_uris: [str(uri)], client_name: str, grant_types: [str], response_types: [str], scope: str, token_endpoint_auth_method: str, client_id_issued_at: int, logo_uri: str(uri), tos_uri: str(uri), policy_uri: str(uri)} # Client registered successfully\n@errors {400: Invalid client metadata}\n\n@endpoint POST /oauth/token\n@desc OAuth token endpoint\n@required {grant_type: str(client_credentials/authorization_code/refresh_token) # OAuth 2.0 grant type}\n@optional {scope: str # Space-separated list of requested scopes (for client_credentials), code: str # Authorization code (for authorization_code flow), redirect_uri: str(uri) # Redirect URI (for authorization_code flow), code_verifier: str # PKCE code verifier (for authorization_code flow), refresh_token: str # Refresh token (for refresh_token flow), client_id: str # OAuth client ID (if not using HTTP Basic auth), client_secret: str # OAuth client secret (if not using HTTP Basic auth)}\n@returns(200) {access_token: str, token_type: str, expires_in: int, scope: str, refresh_token: str} # Token response\n@errors {400: Invalid request, 401: Invalid client credentials}\n\n@endgroup\n\n@group oauth_clients\n@endpoint GET /oauth_clients\n@desc List OAuth clients\n@optional {page[size]: int=20: any # Number of results per page, page[number]: int=1 # Page number, filter[client_type]: str(confidential/public) # Filter by client type, filter[verified]: bool # Filter by verification status, filter[allowed_grant_types][contains]: str(client_credentials/authorization_code/refresh_token) # Filter by allowed grant type, filter[name]: str # Filter by exact client name, filter[name][contains]: str # Filter by client name containing text, filter[client_id]: str # Filter by client ID}\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_results: int, total_pages: int}} # List of OAuth clients\n@errors {401: Unauthorized}\n\n@endpoint POST /oauth_clients\n@desc Create OAuth client\n@required {name: str # The name of the OAuth client, allowed_scopes: [str] # List of allowed OAuth scopes, client_type: str(public/confidential) # OAuth client type, allowed_grant_types: [str] # List of allowed OAuth grant types}\n@optional {require_pkce: bool=false # Whether PKCE (Proof Key for Code Exchange) is required for this client, redirect_uris: [str(uri)]= # List of redirect URIs (required for authorization_code flow), logo_uri: str(uri) # URL of the client logo, policy_uri: str(uri) # URL of the client's privacy policy, tos_uri: str(uri) # URL of the client's terms of service}\n@returns(201) {data: map{record_type: str, client_id: str, name: str, org_id: str, user_id: str, allowed_scopes: [str], client_type: str, require_pkce: bool, allowed_grant_types: [str], redirect_uris: [str(uri)], logo_uri: str(uri)?, tos_uri: str(uri)?, policy_uri: str(uri)?, client_secret: str?, created_at: str(date-time), updated_at: str(date-time)}} # OAuth client created successfully\n@errors {400: Invalid request, 401: Unauthorized, 422: Validation error}\n\n@endpoint DELETE /oauth_clients/{id}\n@desc Delete OAuth client\n@required {id: str(uuid) # OAuth client ID}\n@returns(204) OAuth client deleted successfully\n@errors {404: OAuth client not found}\n\n@endpoint GET /oauth_clients/{id}\n@desc Get OAuth client\n@required {id: str(uuid) # OAuth client ID}\n@returns(200) {data: map{record_type: str, client_id: str, name: str, org_id: str, user_id: str, allowed_scopes: [str], client_type: str, require_pkce: bool, allowed_grant_types: [str], redirect_uris: [str(uri)], logo_uri: str(uri)?, tos_uri: str(uri)?, policy_uri: str(uri)?, client_secret: str?, created_at: str(date-time), updated_at: str(date-time)}} # OAuth client details\n@errors {404: OAuth client not found}\n\n@endpoint PUT /oauth_clients/{id}\n@desc Update OAuth client\n@required {id: str(uuid) # OAuth client ID}\n@optional {name: str # The name of the OAuth client, allowed_scopes: [str] # List of allowed OAuth scopes, require_pkce: bool # Whether PKCE (Proof Key for Code Exchange) is required for this client, allowed_grant_types: [str] # List of allowed OAuth grant types, redirect_uris: [str(uri)] # List of redirect URIs, logo_uri: str(uri) # URL of the client logo, policy_uri: str(uri) # URL of the client's privacy policy, tos_uri: str(uri) # URL of the client's terms of service}\n@returns(200) {data: map{record_type: str, client_id: str, name: str, org_id: str, user_id: str, allowed_scopes: [str], client_type: str, require_pkce: bool, allowed_grant_types: [str], redirect_uris: [str(uri)], logo_uri: str(uri)?, tos_uri: str(uri)?, policy_uri: str(uri)?, client_secret: str?, created_at: str(date-time), updated_at: str(date-time)}} # OAuth client updated successfully\n@errors {404: OAuth client not found, 422: Validation error}\n\n@endgroup\n\n@group oauth_grants\n@endpoint GET /oauth_grants\n@desc List OAuth grants\n@optional {page[size]: int=20: any # Number of results per page, page[number]: int=1 # Page number}\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_results: int, total_pages: int}} # List of OAuth grants\n@errors {400: Bad Request, 401: Unauthorized}\n\n@endpoint DELETE /oauth_grants/{id}\n@desc Revoke OAuth grant\n@required {id: str(uuid) # OAuth grant ID}\n@returns(200) {data: map{id: str(uuid), record_type: str, client_id: str, scopes: [str], last_used_at: str(date-time)?, created_at: str(date-time)}} # OAuth grant revoked successfully\n@errors {404: OAuth grant not found}\n\n@endpoint GET /oauth_grants/{id}\n@desc Get OAuth grant\n@required {id: str(uuid) # OAuth grant ID}\n@returns(200) {data: map{id: str(uuid), record_type: str, client_id: str, scopes: [str], last_used_at: str(date-time)?, created_at: str(date-time)}} # OAuth grant details\n@errors {404: OAuth grant not found}\n\n@endgroup\n\n@group operator_connect\n@endpoint POST /operator_connect/actions/refresh\n@desc Refresh Operator Connect integration\n@returns(200) {success: bool, message: str} # Successful response\n@returns(202) {success: bool, message: str} # Successful response\n@errors {401: Unauthorized}\n\n@endgroup\n\n@group organizations\n@endpoint GET /organizations/users\n@desc List organization users\n@optional {page[number]: int=1: any # The page number to load, page[size]: int=250 # The size of the page, filter[user_status]: str(enabled/disabled/blocked) # Filter by user status, filter[email]: str # Filter by email address (partial match), include_groups: bool=false # When set to true, includes the groups array for each user in the response. The groups array contains objects with id and name for each group the user belongs to.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of organization users.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action.}\n\n@endpoint GET /organizations/users/users_groups_report\n@desc Get organization users groups report\n@optional {Accept: str(application/json/text/csv)=application/json # Specify the response format. Use 'application/json' for JSON format or 'text/csv' for CSV format.}\n@returns(200) {data: [map]} # Successful response with a list of organization users and their group memberships.\n@errors {401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist.}\n\n@endpoint GET /organizations/users/{id}\n@desc Get organization user\n@required {id: str # Organization User ID}\n@optional {include_groups: bool=false # When set to true, includes the groups array for each user in the response. The groups array contains objects with id and name for each group the user belongs to.}\n@returns(200) {data: map{id: str, record_type: str, email: str(email), user_status: str, organization_user_bypasses_sso: bool, created_at: str, last_sign_in_at: str?, groups: [map]}} # Successful response with details about an Organization User.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist.}\n\n@endpoint POST /organizations/users/{id}/actions/remove\n@desc Delete organization user\n@required {id: str # Organization User ID}\n@returns(200) {data: map{id: str, record_type: str, email: str(email), user_status: str, organization_user_bypasses_sso: bool, created_at: str, last_sign_in_at: str?, groups: [map]}} # Successful response with details about an Organization User.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist.}\n\n@endgroup\n\n@group ota_updates\n@endpoint GET /ota_updates\n@desc List OTA updates\n@optional {filter: map # Consolidated filter parameter for OTA updates (deepObject style). Originally: filter[status], filter[sim_card_id], filter[type], page: map # Consolidated pagination parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {401: Unauthorized}\n\n@endpoint GET /ota_updates/{id}\n@desc Get OTA update\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: map{id: str(uuid), record_type: str, sim_card_id: str(uuid), type: str, status: str, settings: map{mobile_network_operators_preferences: [map]}, created_at: str, updated_at: str}} # Successful response\n@errors {401: Unauthorized}\n\n@endgroup\n\n@group outbound_voice_profiles\n@endpoint GET /outbound_voice_profiles\n@desc Get all outbound voice profiles\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[name][contains], sort: str(enabled/-enabled/created_at/-created_at/name/-name/service_plan/-service_plan/traffic_type/-traffic_type/usage_payment_method/-usage_payment_method)=-created_at # Specifies the sort order for results. By default sorting direction is ascending. To have the results sorted in descending order add the - prefix. That is:         name: sorts the result by the     name field in ascending order.            -name: sorts the result by the     name field in descending order.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {401: Unauthorized, 422: Bad request}\n\n@endpoint POST /outbound_voice_profiles\n@desc Create an outbound voice profile\n@required {name: str # A user-supplied name to help with organization.}\n@optional {traffic_type: str=conversational # Specifies the type of traffic allowed in this profile., service_plan: str=global # Indicates the coverage of the termination regions., concurrent_call_limit: int # Must be no more than your global concurrent call limit. Null means no limit., enabled: bool=true # Specifies whether the outbound voice profile can be used. Disabled profiles will result in outbound calls being blocked for the associated Connections., tags: [str], usage_payment_method: str=rate-deck # Setting for how costs for outbound profile are calculated., whitelisted_destinations: [str]=US,CA # The list of destinations you want to be able to call using this outbound voice profile formatted in alpha2., max_destination_rate: num # Maximum rate (price per minute) for a Destination to be allowed when making outbound calls., daily_spend_limit: str # The maximum amount of usage charges, in USD, you want Telnyx to allow on this outbound voice profile in a day before disallowing new calls., daily_spend_limit_enabled: bool=false # Specifies whether to enforce the daily_spend_limit on this outbound voice profile., call_recording: map{call_recording_type: str, call_recording_caller_phone_numbers: [str], call_recording_channels: str, call_recording_format: str}, billing_group_id: str(uuid)=null # The ID of the billing group associated with the outbound proflile. Defaults to null (for no group assigned)., calling_window: map{start_time: str(time), end_time: str(time), calls_per_cld: int} # Specifies the time window and call limits for calls made using this outbound voice profile. Note that all times are UTC in 24-hour clock time.}\n@returns(200) {data: map{id: str, record_type: str, name: str, connections_count: int, traffic_type: str, service_plan: str, concurrent_call_limit: int?, enabled: bool, tags: [str], usage_payment_method: str, whitelisted_destinations: [str], max_destination_rate: num, daily_spend_limit: str, daily_spend_limit_enabled: bool, call_recording: map{call_recording_type: str, call_recording_caller_phone_numbers: [str], call_recording_channels: str, call_recording_format: str}, billing_group_id: str(uuid)?, calling_window: map{start_time: str, end_time: str, calls_per_cld: int}, created_at: str, updated_at: str}} # Successful response\n@errors {401: Unauthorized, 404: Resource not found, 422: Bad request}\n\n@endpoint DELETE /outbound_voice_profiles/{id}\n@desc Delete an outbound voice profile\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{id: str, record_type: str, name: str, connections_count: int, traffic_type: str, service_plan: str, concurrent_call_limit: int?, enabled: bool, tags: [str], usage_payment_method: str, whitelisted_destinations: [str], max_destination_rate: num, daily_spend_limit: str, daily_spend_limit_enabled: bool, call_recording: map{call_recording_type: str, call_recording_caller_phone_numbers: [str], call_recording_channels: str, call_recording_format: str}, billing_group_id: str(uuid)?, calling_window: map{start_time: str, end_time: str, calls_per_cld: int}, created_at: str, updated_at: str}} # Successful response\n@errors {401: Unauthorized, 404: Resource not found, 422: Bad request}\n\n@endpoint GET /outbound_voice_profiles/{id}\n@desc Retrieve an outbound voice profile\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{id: str, record_type: str, name: str, connections_count: int, traffic_type: str, service_plan: str, concurrent_call_limit: int?, enabled: bool, tags: [str], usage_payment_method: str, whitelisted_destinations: [str], max_destination_rate: num, daily_spend_limit: str, daily_spend_limit_enabled: bool, call_recording: map{call_recording_type: str, call_recording_caller_phone_numbers: [str], call_recording_channels: str, call_recording_format: str}, billing_group_id: str(uuid)?, calling_window: map{start_time: str, end_time: str, calls_per_cld: int}, created_at: str, updated_at: str}} # Successful response\n@errors {401: Unauthorized, 404: Resource not found, 422: Bad request}\n\n@endpoint PATCH /outbound_voice_profiles/{id}\n@desc Updates an existing outbound voice profile.\n@required {id: str # Identifies the resource., name: str # A user-supplied name to help with organization.}\n@optional {traffic_type: str=conversational # Specifies the type of traffic allowed in this profile., service_plan: str=global # Indicates the coverage of the termination regions., concurrent_call_limit: int # Must be no more than your global concurrent call limit. Null means no limit., enabled: bool=true # Specifies whether the outbound voice profile can be used. Disabled profiles will result in outbound calls being blocked for the associated Connections., tags: [str], usage_payment_method: str=rate-deck # Setting for how costs for outbound profile are calculated., whitelisted_destinations: [str]=US,CA # The list of destinations you want to be able to call using this outbound voice profile formatted in alpha2., max_destination_rate: num # Maximum rate (price per minute) for a Destination to be allowed when making outbound calls., daily_spend_limit: str # The maximum amount of usage charges, in USD, you want Telnyx to allow on this outbound voice profile in a day before disallowing new calls., daily_spend_limit_enabled: bool=false # Specifies whether to enforce the daily_spend_limit on this outbound voice profile., call_recording: map{call_recording_type: str, call_recording_caller_phone_numbers: [str], call_recording_channels: str, call_recording_format: str}, billing_group_id: str(uuid)=null # The ID of the billing group associated with the outbound proflile. Defaults to null (for no group assigned)., calling_window: map{start_time: str(time), end_time: str(time), calls_per_cld: int} # Specifies the time window and call limits for calls made using this outbound voice profile.}\n@returns(200) {data: map{id: str, record_type: str, name: str, connections_count: int, traffic_type: str, service_plan: str, concurrent_call_limit: int?, enabled: bool, tags: [str], usage_payment_method: str, whitelisted_destinations: [str], max_destination_rate: num, daily_spend_limit: str, daily_spend_limit_enabled: bool, call_recording: map{call_recording_type: str, call_recording_caller_phone_numbers: [str], call_recording_channels: str, call_recording_format: str}, billing_group_id: str(uuid)?, calling_window: map{start_time: str, end_time: str, calls_per_cld: int}, created_at: str, updated_at: str}} # Successful response\n@errors {401: Unauthorized, 404: Resource not found, 409: Conflict. Another update to this outbound voice profile is still in progress. Wait and retry the request later., 422: Bad request}\n\n@endgroup\n\n@group payment\n@endpoint GET /payment/auto_recharge_prefs\n@desc List auto recharge preferences\n@returns(200) {data: map{id: str, record_type: str, threshold_amount: str, recharge_amount: str, enabled: bool, invoice_enabled: bool, preference: str}} # Successful response\n@errors {400: Bad request, 401: Unauthorized, 404: Resource not found}\n\n@endpoint PATCH /payment/auto_recharge_prefs\n@desc Update auto recharge preferences\n@optional {threshold_amount: str # The threshold amount at which the account will be recharged., recharge_amount: str # The amount to recharge the account, the actual recharge amount will be the amount necessary to reach the threshold amount plus the recharge amount., enabled: bool # Whether auto recharge is enabled., invoice_enabled: bool, preference: str(credit_paypal/ach) # The payment preference for auto recharge.}\n@returns(200) {data: map{id: str, record_type: str, threshold_amount: str, recharge_amount: str, enabled: bool, invoice_enabled: bool, preference: str}} # Successful response\n@errors {401: Unauthorized, 404: Resource not found, 422: Bad request}\n\n@endgroup\n\n@group phone_number_blocks\n@endpoint GET /phone_number_blocks/jobs\n@desc Lists the phone number blocks jobs\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], sort: str # Specifies the sort order for results. If not given, results are sorted by created_at in descending order., filter: map # Consolidated filter parameter (deepObject style). Originally: filter[type], filter[status]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of phone number blocks background jobs.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint POST /phone_number_blocks/jobs/delete_phone_number_block\n@desc Deletes all numbers associated with a phone number block\n@required {phone_number_block_id: str}\n@returns(202) {data: map{id: str(uuid), record_type: str, status: str, type: str, etc: str(date-time), created_at: str, updated_at: str, successful_operations: [map], failed_operations: [map]}} # Block deletion job accepted. The response contains a background job; poll GET /phone_numbers/jobs/{id} with the job id until it completes.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /phone_number_blocks/jobs/{id}\n@desc Retrieves a phone number blocks job\n@required {id: str # Identifies the Phone Number Blocks Job.}\n@returns(200) {data: map{id: str(uuid), record_type: str, status: str, type: str, etc: str(date-time), created_at: str, updated_at: str, successful_operations: [map], failed_operations: [map]}} # Phone number blocks job details.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group phone_numbers\n@endpoint GET /phone_numbers\n@desc List phone numbers\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], sort: str(purchased_at/phone_number/connection_name/usage_payment_method) # Specifies the sort order for results. If not given, results are sorted by created_at in descending order., filter: map # Consolidated filter parameter (deepObject style). Originally: filter[tag], filter[phone_number], filter[status], filter[country_iso_alpha2], filter[connection_id], filter[voice.connection_name], filter[voice.usage_payment_method], filter[billing_group_id], filter[emergency_address_id], filter[customer_reference], filter[number_type], filter[source], handle_messaging_profile_error: str(true/false)=false # Although it is an infrequent occurrence, due to the highly distributed nature of the Telnyx platform, it is possible that there will be an issue when loading in Messaging Profile information. As such, when this parameter is set to `true` and an error in fetching this information occurs, messaging profile related fields will be omitted in the response and an error message will be included instead of returning a 503 error.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}, errors: [map]} # Successful response with a list of phone numbers.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint POST /phone_numbers/actions/verify_ownership\n@desc Verify ownership of phone numbers\n@required {phone_numbers: [str] # Array of phone numbers to verify ownership for}\n@returns(200) {data: map{found: [map], not_found: [str], record_type: str}} # Phone number ownership verification completed.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /phone_numbers/csv_downloads\n@desc List CSV downloads\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of CSV downloads.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint POST /phone_numbers/csv_downloads\n@desc Create a CSV download\n@optional {csv_format: str(V1/V2)=V1 # Which format to use when generating the CSV file. The default for backwards compatibility is 'V1', filter: map # Consolidated filter parameter (deepObject style). Originally: filter[has_bundle], filter[tag], filter[connection_id], filter[phone_number], filter[status], filter[voice.connection_name], filter[voice.usage_payment_method], filter[billing_group_id], filter[emergency_address_id], filter[customer_reference]}\n@returns(200) {data: [map]} # Successful response with details about a CSV download.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /phone_numbers/csv_downloads/{id}\n@desc Retrieve a CSV download\n@required {id: str # Identifies the CSV download.}\n@returns(200) {data: [map]} # Successful response with details about a CSV download.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /phone_numbers/jobs\n@desc Lists the phone numbers jobs\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], sort: str # Specifies the sort order for results. If not given, results are sorted by created_at in descending order., filter: map # Consolidated filter parameter (deepObject style). Originally: filter[type], filter[phone_number], filter[phone_number][], filter[status][]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of phone numbers background jobs.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 422: Unprocessable Entity, 500: Unexpected error}\n\n@endpoint POST /phone_numbers/jobs/delete_phone_numbers\n@desc Delete a batch of numbers\n@required {phone_numbers: [str]}\n@returns(202) {data: map{id: str(uuid), record_type: str, status: str, type: str, etc: str(date-time), created_at: str, updated_at: str, phone_numbers: [map], successful_operations: [map], pending_operations: [map], failed_operations: [map]}} # Deletion job accepted. The response contains a background job; poll GET /phone_numbers/jobs/{id} with the job id until it completes.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: Forbidden, 422: Unprocessable Entity, 500: Unexpected error}\n\n@endpoint POST /phone_numbers/jobs/update_emergency_settings\n@desc Update the emergency settings from a batch of numbers\n@required {phone_numbers: [str], emergency_enabled: bool # Indicates whether to enable or disable emergency services on the numbers.}\n@optional {emergency_address_id: str # Identifies the address to be used with emergency services. Required if emergency_enabled is true, must be null or omitted if emergency_enabled is false.}\n@returns(202) {data: map{id: str(uuid), record_type: str, status: str, type: str, etc: str(date-time), created_at: str, updated_at: str, phone_numbers: [map], successful_operations: [map], pending_operations: [map], failed_operations: [map]}} # Emergency settings job accepted. The response contains a background job; poll GET /phone_numbers/jobs/{id} with the job id until it completes.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: Forbidden, 422: Unprocessable Entity, 500: Unexpected error}\n\n@endpoint POST /phone_numbers/jobs/update_phone_numbers\n@desc Update a batch of numbers\n@required {phone_numbers: [str] # Array of phone number ids and/or phone numbers in E164 format to update. This parameter is required if no filter parameters are provided. If you want to update specific numbers rather than all numbers matching a filter, you must use this parameter. Each item must be either a valid phone number ID or a phone number in E164 format (e.g., '+13127367254').}\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[has_bundle], filter[tag], filter[connection_id], filter[phone_number], filter[status], filter[voice.connection_name], filter[voice.usage_payment_method], filter[billing_group_id], filter[emergency_address_id], filter[customer_reference], tags: [str] # A list of user-assigned tags to help organize phone numbers., external_pin: str # If someone attempts to port your phone number away from Telnyx and your phone number has an external PIN set, we will attempt to verify that you provided the correct external PIN to the winning carrier. Note that not all carriers cooperate with this security mechanism., customer_reference: str # A customer reference string for customer look ups., connection_id: str # Identifies the connection associated with the phone number., billing_group_id: str # Identifies the billing group associated with the phone number., hd_voice_enabled: bool # Indicates whether to enable or disable HD Voice on each phone number. HD Voice is a paid feature and may not be available for all phone numbers, more details about it can be found in the Telnyx support documentation., deletion_lock_enabled: bool # Indicates whether to enable or disable the deletion lock on each phone number. When enabled, this prevents the phone number from being deleted via the API or Telnyx portal., voice: map{tech_prefix_enabled: bool, translated_number: str, caller_id_name_enabled: bool, call_forwarding: map, cnam_listing: map, usage_payment_method: str, media_features: map, call_recording: map, inbound_call_screening: str}}\n@returns(202) {data: map{id: str(uuid), record_type: str, status: str, type: str, etc: str(date-time), created_at: str, updated_at: str, phone_numbers: [map], successful_operations: [map], pending_operations: [map], failed_operations: [map]}} # Update job accepted. The response contains a background job; poll GET /phone_numbers/jobs/{id} with the job id until it completes.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: Forbidden, 422: Unprocessable Entity, 500: Unexpected error}\n\n@endpoint GET /phone_numbers/jobs/{id}\n@desc Retrieve a phone numbers job\n@required {id: str # Identifies the Phone Numbers Job.}\n@returns(200) {data: map{id: str(uuid), record_type: str, status: str, type: str, etc: str(date-time), created_at: str, updated_at: str, phone_numbers: [map], successful_operations: [map], pending_operations: [map], failed_operations: [map]}} # Phone numbers job details.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: Not Found, 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /phone_numbers/messaging\n@desc List phone numbers with messaging settings\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size], filter[messaging_profile_id]: str(uuid) # Filter by messaging profile ID., filter[phone_number]: str # Filter by exact phone number (supports comma-separated list)., filter[phone_number][contains]: str # Filter by phone number substring., filter[type]: str(tollfree/longcode/shortcode) # Filter by phone number type., sort[phone_number]: str(asc/desc) # Sort by phone number.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of phone numbers with messaging settings.\n@errors {4XX: Unexpected error}\n\n@endpoint GET /phone_numbers/regulatory_requirements\n@desc Retrieve regulatory requirements for a list of phone numbers\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[phone_number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # An array of Regulatory Requirements Responses\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /phone_numbers/slim\n@desc Slim List phone numbers\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], include_connection: bool=false # Include the connection associated with the phone number., include_tags: bool=false # Include the tags associated with the phone number., sort: str(purchased_at/phone_number/connection_name/usage_payment_method) # Specifies the sort order for results. If not given, results are sorted by created_at in descending order., filter: map # Consolidated filter parameter (deepObject style). Originally: filter[tag], filter[phone_number], filter[status], filter[country_iso_alpha2], filter[connection_id], filter[voice.connection_name], filter[voice.usage_payment_method], filter[billing_group_id], filter[emergency_address_id], filter[customer_reference], filter[number_type], filter[source]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of phone numbers.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /phone_numbers/voice\n@desc List phone numbers with voice settings\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], sort: str(purchased_at/phone_number/connection_name/usage_payment_method) # Specifies the sort order for results. If not given, results are sorted by created_at in descending order., filter: map # Consolidated filter parameter (deepObject style). Originally: filter[phone_number], filter[connection_name], filter[customer_reference], filter[voice.usage_payment_method]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of phone numbers with voice settings.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint DELETE /phone_numbers/{id}\n@desc Delete a phone number\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{id: str, record_type: str, phone_number: str, status: str, tags: [str], external_pin: str, connection_name: str, connection_id: str, customer_reference: str, messaging_profile_id: str, messaging_profile_name: str, billing_group_id: str, emergency_enabled: bool, emergency_address_id: str, call_forwarding_enabled: bool, cnam_listing_enabled: bool, caller_id_name_enabled: bool, call_recording_enabled: bool, t38_fax_gateway_enabled: bool, purchased_at: str, created_at: str, updated_at: str, hd_voice_enabled: bool, phone_number_type: str, deletion_lock_enabled: bool, activated_at: any}} # Successful response with details about a phone number.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /phone_numbers/{id}\n@desc Retrieve a phone number\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{id: str, record_type: str, phone_number: str, country_iso_alpha2: str, status: str, tags: [str], external_pin: str?, connection_name: str?, connection_id: str?, customer_reference: str?, messaging_profile_id: str?, messaging_profile_name: str?, messaging_campaign_id: str?, billing_group_id: str?, emergency_enabled: bool, emergency_address_id: str?, emergency_status: str, call_forwarding_enabled: bool, cnam_listing_enabled: bool, caller_id_name_enabled: bool, call_recording_enabled: bool, t38_fax_gateway_enabled: bool, purchased_at: str, created_at: str(date-time), phone_number_type: str, inbound_call_screening: str, updated_at: str, hd_voice_enabled: bool, source_type: any, deletion_lock_enabled: bool, activated_at: any}} # Successful response with details about a phone number.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint PATCH /phone_numbers/{id}\n@desc Update a phone number\n@required {id: str # Identifies the resource.}\n@optional {id: str # Identifies the type of resource., tags: [str] # A list of user-assigned tags to help organize phone numbers., external_pin: str # If someone attempts to port your phone number away from Telnyx and your phone number has an external PIN set, we will attempt to verify that you provided the correct external PIN to the winning carrier. Note that not all carriers cooperate with this security mechanism., hd_voice_enabled: bool # Indicates whether HD voice is enabled for this number., customer_reference: str # A customer reference string for customer look ups., address_id: str # Identifies the address associated with the phone number., connection_id: str # Identifies the connection associated with the phone number., billing_group_id: str # Identifies the billing group associated with the phone number.}\n@returns(200) {data: map{id: str, record_type: str, phone_number: str, country_iso_alpha2: str, status: str, tags: [str], external_pin: str?, connection_name: str?, connection_id: str?, customer_reference: str?, messaging_profile_id: str?, messaging_profile_name: str?, messaging_campaign_id: str?, billing_group_id: str?, emergency_enabled: bool, emergency_address_id: str?, emergency_status: str, call_forwarding_enabled: bool, cnam_listing_enabled: bool, caller_id_name_enabled: bool, call_recording_enabled: bool, t38_fax_gateway_enabled: bool, purchased_at: str, created_at: str(date-time), phone_number_type: str, inbound_call_screening: str, updated_at: str, hd_voice_enabled: bool, source_type: any, deletion_lock_enabled: bool, activated_at: any}} # Successful response with details about a phone number.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint PATCH /phone_numbers/{id}/actions/bundle_status_change\n@desc Change the bundle status for a phone number (set to being in a bundle or remove from a bundle)\n@required {id: str # Identifies the resource., bundle_id: str # The new bundle_id setting for the number. If you are assigning the number to a bundle, this is the unique ID of the bundle you wish to use. If you are removing the number from a bundle, this must be null. You cannot assign a number from one bundle to another directly. You must first remove it from a bundle, and then assign it to a new bundle.}\n@returns(200) {data: map{id: str, record_type: str, phone_number: str, connection_id: str, customer_reference: str, tech_prefix_enabled: bool, translated_number: str, call_forwarding: map{call_forwarding_enabled: bool, forwards_to: str, forwarding_type: str}, cnam_listing: map{cnam_listing_enabled: bool, cnam_listing_details: str}, emergency: map{emergency_enabled: bool, emergency_address_id: str, emergency_status: str}, usage_payment_method: str, media_features: map{rtp_auto_adjust_enabled: bool, accept_any_rtp_packets_enabled: bool, t38_fax_gateway_enabled: bool}, call_recording: map{inbound_call_recording_enabled: bool, inbound_call_recording_format: str, inbound_call_recording_channels: str}, inbound_call_screening: str}} # Phone number bundle status change success\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint POST /phone_numbers/{id}/actions/enable_emergency\n@desc Enable emergency for a phone number\n@required {id: str # Identifies the resource., emergency_enabled: bool # Indicates whether to enable emergency services on this number., emergency_address_id: str # Identifies the address to be used with emergency services.}\n@returns(200) {data: map{id: str, record_type: str, phone_number: str, connection_id: str, customer_reference: str, tech_prefix_enabled: bool, translated_number: str, call_forwarding: map{call_forwarding_enabled: bool, forwards_to: str, forwarding_type: str}, cnam_listing: map{cnam_listing_enabled: bool, cnam_listing_details: str}, emergency: map{emergency_enabled: bool, emergency_address_id: str, emergency_status: str}, usage_payment_method: str, media_features: map{rtp_auto_adjust_enabled: bool, accept_any_rtp_packets_enabled: bool, t38_fax_gateway_enabled: bool}, call_recording: map{inbound_call_recording_enabled: bool, inbound_call_recording_format: str, inbound_call_recording_channels: str}, inbound_call_screening: str}} # Phone number emergency enabled.\n@returns(202) {data: map{id: str, record_type: str, phone_number: str, connection_id: str, customer_reference: str, tech_prefix_enabled: bool, translated_number: str, call_forwarding: map{call_forwarding_enabled: bool, forwards_to: str, forwarding_type: str}, cnam_listing: map{cnam_listing_enabled: bool, cnam_listing_details: str}, emergency: map{emergency_enabled: bool, emergency_address_id: str, emergency_status: str}, usage_payment_method: str, media_features: map{rtp_auto_adjust_enabled: bool, accept_any_rtp_packets_enabled: bool, t38_fax_gateway_enabled: bool}, call_recording: map{inbound_call_recording_enabled: bool, inbound_call_recording_format: str, inbound_call_recording_channels: str}, inbound_call_screening: str}} # Phone number emergency requested.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /phone_numbers/{id}/messaging\n@desc Retrieve a phone number with messaging settings\n@required {id: str # Identifies the type of resource.}\n@returns(200) {data: map{record_type: str, id: str, phone_number: str, messaging_profile_id: str?, created_at: str(date-time), updated_at: str(date-time), country_code: str, type: str, health: map{message_count: int, inbound_outbound_ratio: num(float), success_ratio: num(float), spam_ratio: num(float)}, eligible_messaging_products: [str], traffic_type: str, messaging_product: str, features: map{sms: map?, mms: map?}, organization_id: str, tags: [str]}} # Successful response with details about a phone number including messaging settings.\n@errors {4XX: Unexpected error}\n\n@endpoint PATCH /phone_numbers/{id}/messaging\n@desc Update the messaging profile and/or messaging product of a phone number\n@required {id: str # The phone number to update.}\n@optional {messaging_profile_id: str # Configure the messaging profile this phone number is assigned to:  * Omit this field or set its value to `null` to keep the current value. * Set this field to `\"\"` to unassign the number from its messaging profile * Set this field to a quoted UUID of a messaging profile to assign this number to that messaging profile, messaging_product: str # Configure the messaging product for this number:  * Omit this field or set its value to `null` to keep the current value. * Set this field to a quoted product ID to set this phone number to that product, tags: [str] # Tags to set on this phone number.}\n@returns(200) {data: map{record_type: str, id: str, phone_number: str, messaging_profile_id: str?, created_at: str(date-time), updated_at: str(date-time), country_code: str, type: str, health: map{message_count: int, inbound_outbound_ratio: num(float), success_ratio: num(float), spam_ratio: num(float)}, eligible_messaging_products: [str], traffic_type: str, messaging_product: str, features: map{sms: map?, mms: map?}, organization_id: str, tags: [str]}} # Successful response with details about a phone number including messaging settings.\n@errors {4XX: Unexpected error}\n\n@endpoint GET /phone_numbers/{id}/voice\n@desc Retrieve a phone number with voice settings\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{id: str, record_type: str, phone_number: str, connection_id: str, customer_reference: str, tech_prefix_enabled: bool, translated_number: str, call_forwarding: map{call_forwarding_enabled: bool, forwards_to: str, forwarding_type: str}, cnam_listing: map{cnam_listing_enabled: bool, cnam_listing_details: str}, emergency: map{emergency_enabled: bool, emergency_address_id: str, emergency_status: str}, usage_payment_method: str, media_features: map{rtp_auto_adjust_enabled: bool, accept_any_rtp_packets_enabled: bool, t38_fax_gateway_enabled: bool}, call_recording: map{inbound_call_recording_enabled: bool, inbound_call_recording_format: str, inbound_call_recording_channels: str}, inbound_call_screening: str}} # Successful response with details about a phone number including voice settings.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint PATCH /phone_numbers/{id}/voice\n@desc Update a phone number with voice settings\n@required {id: str # Identifies the resource.}\n@optional {tech_prefix_enabled: bool=false # Controls whether a tech prefix is enabled for this phone number., translated_number: str # This field allows you to rewrite the destination number of an inbound call before the call is routed to you. The value of this field may be any alphanumeric value, and the value will replace the number originally dialed., caller_id_name_enabled: bool=false # Controls whether the caller ID name is enabled for this phone number., call_forwarding: map{call_forwarding_enabled: bool, forwards_to: str, forwarding_type: str} # The call forwarding settings for a phone number., cnam_listing: map{cnam_listing_enabled: bool, cnam_listing_details: str} # The CNAM listing settings for a phone number., usage_payment_method: str(pay-per-minute/channel)=pay-per-minute # Controls whether a number is billed per minute or uses your concurrent channels., media_features: map{rtp_auto_adjust_enabled: bool, accept_any_rtp_packets_enabled: bool, t38_fax_gateway_enabled: bool} # The media features settings for a phone number., call_recording: map{inbound_call_recording_enabled: bool, inbound_call_recording_format: str, inbound_call_recording_channels: str} # The call recording settings for a phone number., inbound_call_screening: str(disabled/reject_calls/flag_calls)=disabled # The inbound_call_screening setting is a phone number configuration option variable that allows users to configure their settings to block or flag fraudulent calls. It can be set to disabled, reject_calls, or flag_calls. This feature has an additional per-number monthly cost associated with it.}\n@returns(200) {data: map{id: str, record_type: str, phone_number: str, connection_id: str, customer_reference: str, tech_prefix_enabled: bool, translated_number: str, call_forwarding: map{call_forwarding_enabled: bool, forwards_to: str, forwarding_type: str}, cnam_listing: map{cnam_listing_enabled: bool, cnam_listing_details: str}, emergency: map{emergency_enabled: bool, emergency_address_id: str, emergency_status: str}, usage_payment_method: str, media_features: map{rtp_auto_adjust_enabled: bool, accept_any_rtp_packets_enabled: bool, t38_fax_gateway_enabled: bool}, call_recording: map{inbound_call_recording_enabled: bool, inbound_call_recording_format: str, inbound_call_recording_channels: str}, inbound_call_screening: str}} # Successful response with details about a phone number including voice settings.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /phone_numbers/{phone_number_id}/voicemail\n@desc Get voicemail\n@returns(200) {data: map{enabled: bool, pin: str, greeting: map{mode: str, media_name: str?}}} # Successful response\n@errors {400: Bad request, 401: Unauthorized, 404: Resource not found}\n\n@endpoint PATCH /phone_numbers/{phone_number_id}/voicemail\n@desc Update voicemail\n@optional {pin: str # The pin used for voicemail, enabled: bool # Whether voicemail is enabled., greeting: map{mode: str, media_name: str} # Controls the greeting a caller hears before leaving a voicemail. Set `mode` to `default` to play the standard system greeting, or to `custom_greeting` to play your own audio. When `mode` is `custom_greeting`, `media_name` is required and must reference an audio file already uploaded to your account through the Media Storage API.}\n@returns(200) {data: map{enabled: bool, pin: str, greeting: map{mode: str, media_name: str?}}} # Successful response\n@errors {401: Unauthorized, 404: Resource not found, 422: Bad request}\n\n@endpoint POST /phone_numbers/{phone_number_id}/voicemail\n@desc Create voicemail\n@optional {pin: str # The pin used for voicemail, enabled: bool # Whether voicemail is enabled., greeting: map{mode: str, media_name: str} # Controls the greeting a caller hears before leaving a voicemail. Set `mode` to `default` to play the standard system greeting, or to `custom_greeting` to play your own audio. When `mode` is `custom_greeting`, `media_name` is required and must reference an audio file already uploaded to your account through the Media Storage API.}\n@returns(200) {data: map{enabled: bool, pin: str, greeting: map{mode: str, media_name: str?}}} # Successful response\n@errors {401: Unauthorized, 404: Resource not found, 422: Bad request}\n\n@endgroup\n\n@group phone_numbers_regulatory_requirements\n@endpoint GET /phone_numbers_regulatory_requirements\n@desc Retrieve regulatory requirements for a list of phone numbers\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[phone_number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # An array of Regulatory Requirements Responses\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group portability_checks\n@endpoint POST /portability_checks\n@desc Run a portability check\n@optional {phone_numbers: [str] # The list of +E.164 formatted phone numbers to check for portability}\n@returns(201) {data: [map]} # PortabilityCheck Response\n@errors {401: Unauthorized, 422: Unprocessable entity. Check message field in response for details.}\n\n@endgroup\n\n@group porting\n@endpoint GET /porting/events\n@desc List all porting events\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[type], filter[porting_order_id], filter[created_at][gte], filter[created_at][lte]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details., 500: Internal server error}\n\n@endpoint GET /porting/events/{id}\n@desc Show a porting event\n@required {id: str(uuid) # Identifies the porting event.}\n@returns(200) {data: map} # Successful response\n@errors {404: Not found, 500: Internal server error}\n\n@endpoint POST /porting/events/{id}/republish\n@desc Republish a porting event\n@required {id: str(uuid) # Identifies the porting event.}\n@returns(204) No content\n@errors {404: Not found, 500: Internal server error}\n\n@endpoint GET /porting/loa_configurations\n@desc List LOA configurations\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unprocessable entity. Check message field in response for details., 500: Internal server error}\n\n@endpoint POST /porting/loa_configurations\n@desc Create a LOA configuration\n@required {name: str # The name of the LOA configuration, logo: map{document_id!: str(uuid)} # The logo of the LOA configuration, company_name: str # The name of the company, address: map{street_address!: str, extended_address: str, city!: str, state!: str, zip_code!: str, country_code!: str} # The address of the company., contact: map{email!: str, phone_number!: str} # The contact information of the company.}\n@returns(201) {data: map{id: str(uuid), company_name: str, organization_id: str, name: str, logo: map{document_id: str(uuid), content_type: str}, address: map{street_address: str, extended_address: str, city: str, state: str, zip_code: str, country_code: str}, contact: map{email: str, phone_number: str}, record_type: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {422: Unprocessable entity. Check message field in response for details., 500: Internal server error}\n\n@endpoint POST /porting/loa_configurations/preview\n@desc Preview the LOA configuration parameters\n@required {name: str # The name of the LOA configuration, logo: map{document_id!: str(uuid)} # The logo of the LOA configuration, company_name: str # The name of the company, address: map{street_address!: str, extended_address: str, city!: str, state!: str, zip_code!: str, country_code!: str} # The address of the company., contact: map{email!: str, phone_number!: str} # The contact information of the company.}\n@returns(200) Successful response\n@errors {422: Unprocessable entity. Check message field in response for details., 500: Internal server error}\n\n@endpoint DELETE /porting/loa_configurations/{id}\n@desc Delete a LOA configuration\n@required {id: str(uuid) # Identifies a LOA configuration.}\n@returns(204) No content\n@errors {404: Resource not found, 500: Internal server error}\n\n@endpoint GET /porting/loa_configurations/{id}\n@desc Retrieve a LOA configuration\n@required {id: str(uuid) # Identifies a LOA configuration.}\n@returns(200) {data: map{id: str(uuid), company_name: str, organization_id: str, name: str, logo: map{document_id: str(uuid), content_type: str}, address: map{street_address: str, extended_address: str, city: str, state: str, zip_code: str, country_code: str}, contact: map{email: str, phone_number: str}, record_type: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {404: Resource not found, 500: Internal server error}\n\n@endpoint PATCH /porting/loa_configurations/{id}\n@desc Update a LOA configuration\n@required {id: str(uuid) # Identifies a LOA configuration., name: str # The name of the LOA configuration, logo: map{document_id!: str(uuid)} # The logo of the LOA configuration, company_name: str # The name of the company, address: map{street_address!: str, extended_address: str, city!: str, state!: str, zip_code!: str, country_code!: str} # The address of the company., contact: map{email!: str, phone_number!: str} # The contact information of the company.}\n@returns(200) {data: map{id: str(uuid), company_name: str, organization_id: str, name: str, logo: map{document_id: str(uuid), content_type: str}, address: map{street_address: str, extended_address: str, city: str, state: str, zip_code: str, country_code: str}, contact: map{email: str, phone_number: str}, record_type: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {404: Resource not found, 422: Unprocessable entity. Check message field in response for details., 500: Internal server error}\n\n@endpoint GET /porting/loa_configurations/{id}/preview\n@desc Preview a LOA configuration\n@required {id: str(uuid) # Identifies a LOA configuration.}\n@returns(200) Successful response\n@errors {404: Resource not found, 500: Internal server error}\n\n@endpoint GET /porting/reports\n@desc List porting related reports\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[report_type], filter[status]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unprocessable entity. Check message field in response for details., 500: Internal server error}\n\n@endpoint POST /porting/reports\n@desc Create a porting related report\n@required {report_type: str # Identifies the type of report, params: any}\n@returns(201) {data: map{id: str(uuid), report_type: str, status: str, params: any, document_id: str(uuid), record_type: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {422: Unprocessable entity. Check message field in response for details., 500: Internal server error}\n\n@endpoint GET /porting/reports/{id}\n@desc Retrieve a report\n@required {id: str(uuid) # Identifies a report.}\n@returns(200) {data: map{id: str(uuid), report_type: str, status: str, params: any, document_id: str(uuid), record_type: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {404: Resource not found, 500: Internal server error}\n\n@endpoint GET /porting/uk_carriers\n@desc List available carriers in the UK\n@returns(200) {data: [map]} # Successful response\n@errors {422: Unprocessable entity. Check message field in response for details., 500: Internal server error}\n\n@endgroup\n\n@group porting_orders\n@endpoint GET /porting_orders\n@desc List all porting orders\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], include_phone_numbers: bool=true # Include the first 50 phone number objects in the results, filter: map # Consolidated filter parameter (deepObject style). Originally: filter[customer_reference], filter[customer_group_reference], filter[parent_support_key], filter[phone_numbers.country_code], filter[phone_numbers.carrier_name], filter[misc.type], filter[end_user.admin.entity_name], filter[end_user.admin.auth_person_name], filter[activation_settings.fast_port_eligible], filter[activation_settings.foc_datetime_requested][gt], filter[activation_settings.foc_datetime_requested][lt], filter[phone_numbers.phone_number][contains], sort: map # Consolidated sort parameter (deepObject style). Originally: sort[value]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {401: Unauthorized, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint POST /porting_orders\n@desc Create a porting order\n@required {phone_numbers: [str] # The list of +E.164 formatted phone numbers}\n@optional {customer_reference: str # A customer-specified reference number for customer bookkeeping purposes, customer_group_reference: str # A customer-specified group reference for customer bookkeeping purposes}\n@returns(201) {data: [map]} # Successful response\n@errors {401: Unauthorized, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint GET /porting_orders/exception_types\n@desc List all exception types\n@returns(200) {data: [map]} # Successful response\n@errors {401: Unauthorized, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint GET /porting_orders/phone_number_configurations\n@desc List all phone number configurations\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[porting_order.status][in][], filter[porting_phone_number][in][], filter[user_bundle_id][in][], sort: map # Consolidated sort parameter (deepObject style). Originally: sort[value]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {401: Unauthorized, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint POST /porting_orders/phone_number_configurations\n@desc Create a list of phone number configurations\n@optional {phone_number_configurations: [map{porting_phone_number_id!: str(uuid), user_bundle_id!: str(uuid)}]}\n@returns(201) {data: [map]} # Successful response\n@errors {401: Unauthorized, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint DELETE /porting_orders/{id}\n@desc Delete a porting order\n@required {id: str(uuid) # Porting Order id}\n@returns(204) No content\n@errors {401: Unauthorized, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint GET /porting_orders/{id}\n@desc Retrieve a porting order\n@required {id: str(uuid) # Porting Order id}\n@optional {include_phone_numbers: bool=true # Include the first 50 phone number objects in the results}\n@returns(200) {data: map{id: str(uuid), customer_reference: str?, customer_group_reference: str?, created_at: str(date-time), updated_at: str(date-time), status: map{details: [map], value: str}, support_key: str?, parent_support_key: str?, porting_phone_numbers_count: int, old_service_provider_ocn: str, phone_numbers: [map], documents: map{loa: str(uuid)?, invoice: str(uuid)?}, misc: any, end_user: map{admin: map{entity_name: str?, auth_person_name: str?, billing_phone_number: str?, account_number: str?, tax_identifier: str?, pin_passcode: str?, business_identifier: str?}, location: map{street_address: str?, extended_address: str?, locality: str?, administrative_area: str?, postal_code: str?, country_code: str?}}, activation_settings: map{foc_datetime_requested: str(date-time)?, foc_datetime_actual: str(date-time)?, fast_port_eligible: bool, activation_status: any}, phone_number_configuration: map{billing_group_id: str?, connection_id: str?, messaging_profile_id: str?, emergency_address_id: str?, tags: [str]}, phone_number_type: str, description: str, requirements: [map], requirements_met: bool, user_feedback: map{user_rating: int?, user_comment: str?}, user_id: str(uuid), webhook_url: str(uri)?, record_type: str, messaging: map{messaging_capable: bool, enable_messaging: bool, messaging_port_status: str, messaging_port_completed: bool}, additional_steps: [str]}, meta: map{phone_numbers_url: str}} # Successful response\n@errors {401: Unauthorized}\n\n@endpoint PATCH /porting_orders/{id}\n@desc Edit a porting order\n@required {id: str(uuid) # Porting Order id}\n@optional {misc: any, end_user: map{admin: map, location: map}, documents: map{loa: str(uuid), invoice: str(uuid)} # Can be specified directly or via the `requirement_group_id` parameter., activation_settings: map{foc_datetime_requested: str(date-time)}, phone_number_configuration: map{billing_group_id: str, connection_id: str, messaging_profile_id: str, emergency_address_id: str, tags: [str]}, requirement_group_id: str(uuid) # If present, we will read the current values from the specified Requirement Group into the Documents and Requirements for this Porting Order. Note that any future changes in the Requirement Group would have no impact on this Porting Order. We will return an error if a specified Requirement Group conflicts with documents or requirements in the same request., requirements: [map{field_value!: str, requirement_type_id!: str}] # List of requirements for porting numbers., user_feedback: map{user_rating: int, user_comment: str}, webhook_url: str(uri), customer_reference: str, customer_group_reference: str, messaging: map{enable_messaging: bool}}\n@returns(200) {data: map{id: str(uuid), customer_reference: str?, customer_group_reference: str?, created_at: str(date-time), updated_at: str(date-time), status: map{details: [map], value: str}, support_key: str?, parent_support_key: str?, porting_phone_numbers_count: int, old_service_provider_ocn: str, phone_numbers: [map], documents: map{loa: str(uuid)?, invoice: str(uuid)?}, misc: any, end_user: map{admin: map{entity_name: str?, auth_person_name: str?, billing_phone_number: str?, account_number: str?, tax_identifier: str?, pin_passcode: str?, business_identifier: str?}, location: map{street_address: str?, extended_address: str?, locality: str?, administrative_area: str?, postal_code: str?, country_code: str?}}, activation_settings: map{foc_datetime_requested: str(date-time)?, foc_datetime_actual: str(date-time)?, fast_port_eligible: bool, activation_status: any}, phone_number_configuration: map{billing_group_id: str?, connection_id: str?, messaging_profile_id: str?, emergency_address_id: str?, tags: [str]}, phone_number_type: str, description: str, requirements: [map], requirements_met: bool, user_feedback: map{user_rating: int?, user_comment: str?}, user_id: str(uuid), webhook_url: str(uri)?, record_type: str, messaging: map{messaging_capable: bool, enable_messaging: bool, messaging_port_status: str, messaging_port_completed: bool}, additional_steps: [str]}, meta: map{phone_numbers_url: str}} # Successful response\n@errors {401: Unauthorized, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint POST /porting_orders/{id}/actions/activate\n@desc Activate every number in a porting order asynchronously.\n@required {id: str(uuid) # Porting Order id}\n@returns(202) {data: map{id: str(uuid), status: str, activation_type: str, activate_at: str(date-time), activation_windows: [map], record_type: str, created_at: str(date-time), updated_at: str(date-time)}} # Activation request accepted. Track it via GET /porting_orders/{id}/activation_jobs/{activationJobId} using the returned activation job id.\n@errors {401: Unauthorized, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint POST /porting_orders/{id}/actions/cancel\n@desc Cancel a porting order\n@required {id: str(uuid) # Porting Order id}\n@returns(200) {data: map{id: str(uuid), customer_reference: str?, customer_group_reference: str?, created_at: str(date-time), updated_at: str(date-time), status: map{details: [map], value: str}, support_key: str?, parent_support_key: str?, porting_phone_numbers_count: int, old_service_provider_ocn: str, phone_numbers: [map], documents: map{loa: str(uuid)?, invoice: str(uuid)?}, misc: any, end_user: map{admin: map{entity_name: str?, auth_person_name: str?, billing_phone_number: str?, account_number: str?, tax_identifier: str?, pin_passcode: str?, business_identifier: str?}, location: map{street_address: str?, extended_address: str?, locality: str?, administrative_area: str?, postal_code: str?, country_code: str?}}, activation_settings: map{foc_datetime_requested: str(date-time)?, foc_datetime_actual: str(date-time)?, fast_port_eligible: bool, activation_status: any}, phone_number_configuration: map{billing_group_id: str?, connection_id: str?, messaging_profile_id: str?, emergency_address_id: str?, tags: [str]}, phone_number_type: str, description: str, requirements: [map], requirements_met: bool, user_feedback: map{user_rating: int?, user_comment: str?}, user_id: str(uuid), webhook_url: str(uri)?, record_type: str, messaging: map{messaging_capable: bool, enable_messaging: bool, messaging_port_status: str, messaging_port_completed: bool}, additional_steps: [str]}, meta: map{phone_numbers_url: str}} # Successful response\n@errors {401: Unauthorized, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint POST /porting_orders/{id}/actions/confirm\n@desc Submit a porting order.\n@required {id: str(uuid) # Porting Order id}\n@returns(200) {data: map{id: str(uuid), customer_reference: str?, customer_group_reference: str?, created_at: str(date-time), updated_at: str(date-time), status: map{details: [map], value: str}, support_key: str?, parent_support_key: str?, porting_phone_numbers_count: int, old_service_provider_ocn: str, phone_numbers: [map], documents: map{loa: str(uuid)?, invoice: str(uuid)?}, misc: any, end_user: map{admin: map{entity_name: str?, auth_person_name: str?, billing_phone_number: str?, account_number: str?, tax_identifier: str?, pin_passcode: str?, business_identifier: str?}, location: map{street_address: str?, extended_address: str?, locality: str?, administrative_area: str?, postal_code: str?, country_code: str?}}, activation_settings: map{foc_datetime_requested: str(date-time)?, foc_datetime_actual: str(date-time)?, fast_port_eligible: bool, activation_status: any}, phone_number_configuration: map{billing_group_id: str?, connection_id: str?, messaging_profile_id: str?, emergency_address_id: str?, tags: [str]}, phone_number_type: str, description: str, requirements: [map], requirements_met: bool, user_feedback: map{user_rating: int?, user_comment: str?}, user_id: str(uuid), webhook_url: str(uri)?, record_type: str, messaging: map{messaging_capable: bool, enable_messaging: bool, messaging_port_status: str, messaging_port_completed: bool}, additional_steps: [str]}, meta: map{phone_numbers_url: str}} # Successful response\n@errors {401: Unauthorized, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint POST /porting_orders/{id}/actions/share\n@desc Share a porting order\n@required {id: str(uuid) # Porting Order id}\n@optional {expires_in_seconds: int # The number of seconds the token will be valid for, permissions: str(porting_order.document.read/porting_order.document.update) # The permissions the token will have}\n@returns(201) {data: map{id: str(uuid), porting_order_id: str(uuid), expires_in_seconds: int, permissions: [str], token: str, expires_at: str(date-time), record_type: str, created_at: str(date-time)}} # Successful response\n@errors {401: Unauthorized, 404: Porting Order not found}\n\n@endpoint GET /porting_orders/{id}/activation_jobs\n@desc List all porting activation jobs\n@required {id: str(uuid) # Porting Order id}\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {401: Unauthorized, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint GET /porting_orders/{id}/activation_jobs/{activationJobId}\n@desc Retrieve a porting activation job\n@required {id: str(uuid) # Porting Order id, activationJobId: str(uuid) # Activation Job Identifier}\n@returns(200) {data: map{id: str(uuid), status: str, activation_type: str, activate_at: str(date-time), activation_windows: [map], record_type: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {401: Unauthorized, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint PATCH /porting_orders/{id}/activation_jobs/{activationJobId}\n@desc Update a porting activation job\n@required {id: str(uuid) # Porting Order id, activationJobId: str(uuid) # Activation Job Identifier}\n@optional {activate_at: str(date-time) # The desired activation time. The activation time should be between any of the activation windows.}\n@returns(200) {data: map{id: str(uuid), status: str, activation_type: str, activate_at: str(date-time), activation_windows: [map], record_type: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {404: Not found, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint GET /porting_orders/{id}/additional_documents\n@desc List additional documents\n@required {id: str(uuid) # Porting Order id}\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[document_type], sort: map # Consolidated sort parameter (deepObject style). Originally: sort[value]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {401: Unauthorized, 404: Resource not found}\n\n@endpoint POST /porting_orders/{id}/additional_documents\n@desc Create a list of additional documents\n@required {id: str(uuid) # Porting Order id}\n@optional {additional_documents: [map{document_type: str, document_id: str(uuid)}]}\n@returns(201) {data: [map]} # Successful response\n@errors {401: Unauthorized, 404: Resource not found, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint DELETE /porting_orders/{id}/additional_documents/{additional_document_id}\n@desc Delete an additional document\n@required {id: str(uuid) # Porting Order id, additional_document_id: str(uuid) # Additional document identification.}\n@returns(204) No content\n@errors {401: Unauthorized, 404: Resource not found}\n\n@endpoint GET /porting_orders/{id}/allowed_foc_windows\n@desc List allowed FOC dates\n@required {id: str(uuid) # Porting Order id}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {401: Unauthorized}\n\n@endpoint GET /porting_orders/{id}/comments\n@desc List all comments of a porting order\n@required {id: str(uuid) # Porting Order id}\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {401: Unauthorized, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint POST /porting_orders/{id}/comments\n@desc Create a comment for a porting order\n@required {id: str(uuid) # Porting Order id}\n@optional {body: str}\n@returns(201) {data: map{id: str(uuid), body: str, porting_order_id: str(uuid), user_type: str, record_type: str, created_at: str(date-time)}} # Successful response\n@errors {401: Unauthorized, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint GET /porting_orders/{id}/loa_template\n@desc Download a porting order loa template\n@required {id: str(uuid) # Porting Order id}\n@optional {loa_configuration_id: str(uuid) # The identifier of the LOA configuration to use for the template. If not provided, the default LOA configuration will be used.}\n@returns(200) Successful response\n@errors {401: Unauthorized}\n\n@endpoint GET /porting_orders/{id}/requirements\n@desc List porting order requirements\n@required {id: str(uuid) # Porting Order id}\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {401: Unauthorized, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint GET /porting_orders/{id}/sub_request\n@desc Retrieve the associated V1 sub_request_id and port_request_id\n@required {id: str(uuid) # Porting Order id}\n@returns(200) {data: map{sub_request_id: str, port_request_id: str}} # Successful response\n@errors {401: Unauthorized, 404: Porting Order not found}\n\n@endpoint GET /porting_orders/{id}/verification_codes\n@desc List verification codes\n@required {id: str(uuid) # Porting Order id}\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[verified], sort: map # Consolidated sort parameter (deepObject style). Originally: sort[value]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {401: Unauthorized, 404: Resource not found}\n\n@endpoint POST /porting_orders/{id}/verification_codes/send\n@desc Send the verification codes\n@required {id: str(uuid) # Porting Order id}\n@optional {phone_numbers: [str], verification_method: str(sms/call)}\n@returns(204) No content\n@errors {401: Unauthorized, 404: Resource not found, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint POST /porting_orders/{id}/verification_codes/verify\n@desc Verify the verification code for a list of phone numbers\n@required {id: str(uuid) # Porting Order id}\n@optional {verification_codes: [map{phone_number: str, code: str}]}\n@returns(200) {data: [map]} # Successful response\n@errors {401: Unauthorized, 404: Resource not found, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint GET /porting_orders/{porting_order_id}/action_requirements\n@desc List action requirements for a porting order\n@required {porting_order_id: str # The ID of the porting order}\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[id][in][], filter[requirement_type_id], filter[action_type], filter[status], sort: map # Consolidated sort parameter (deepObject style). Originally: sort[value]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {401: Unauthorized, 404: Porting order not found, 500: Internal server error}\n\n@endpoint POST /porting_orders/{porting_order_id}/action_requirements/{id}/initiate\n@desc Initiate an action requirement\n@required {porting_order_id: str # The ID of the porting order, id: str # The ID of the action requirement, params: any}\n@returns(200) {data: map{id: str, record_type: str, porting_order_id: str, requirement_type_id: str, action_type: str, action_url: str?, status: str, cancel_reason: str?, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {400: Bad request, 401: Unauthorized, 404: Porting order or action requirement not found, 422: Unprocessable entity. Check message field in response for details., 500: Internal server error}\n\n@endpoint GET /porting_orders/{porting_order_id}/associated_phone_numbers\n@desc List all associated phone numbers\n@required {porting_order_id: str(uuid) # Identifies the Porting Order associated with the phone numbers}\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[phone_number], filter[action], sort: map # Consolidated sort parameter (deepObject style). Originally: sort[value]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {401: Unauthorized, 404: Not found, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint POST /porting_orders/{porting_order_id}/associated_phone_numbers\n@desc Create an associated phone number\n@required {porting_order_id: str(uuid) # Identifies the Porting Order associated with the phone number, phone_number_range: map{start_at: str, end_at: str}, action: str(keep/disconnect) # Specifies the action to take with this phone number during partial porting.}\n@returns(201) {data: map{id: str(uuid), porting_order_id: str(uuid), country_code: str, phone_number_type: str, phone_number_range: map{start_at: str, end_at: str}, action: str, record_type: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {404: Not found, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint DELETE /porting_orders/{porting_order_id}/associated_phone_numbers/{id}\n@desc Delete an associated phone number\n@required {porting_order_id: str(uuid) # Identifies the Porting Order associated with the phone number, id: str(uuid) # Identifies the associated phone number to be deleted}\n@returns(200) {data: map{id: str(uuid), porting_order_id: str(uuid), country_code: str, phone_number_type: str, phone_number_range: map{start_at: str, end_at: str}, action: str, record_type: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {404: Not found, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint GET /porting_orders/{porting_order_id}/phone_number_blocks\n@desc List all phone number blocks\n@required {porting_order_id: str(uuid) # Identifies the Porting Order associated with the phone number blocks}\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[porting_order_id], filter[support_key], filter[status], filter[phone_number], filter[activation_status], filter[portability_status], page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], sort: map # Consolidated sort parameter (deepObject style). Originally: sort[value]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {401: Unauthorized, 404: Not found, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint POST /porting_orders/{porting_order_id}/phone_number_blocks\n@desc Create a phone number block\n@required {porting_order_id: str(uuid) # Identifies the Porting Order associated with the phone number block, phone_number_range: map{start_at!: str, end_at!: str}, activation_ranges: [map{start_at!: str, end_at!: str}] # Specifies the activation ranges for this porting phone number block. The activation range must be within the block range and should not overlap with other activation ranges.}\n@returns(201) {data: map{id: str(uuid), country_code: str, phone_number_type: str, phone_number_range: map{start_at: str, end_at: str}, activation_ranges: [map], record_type: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {404: Not found, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint DELETE /porting_orders/{porting_order_id}/phone_number_blocks/{id}\n@desc Delete a phone number block\n@required {porting_order_id: str(uuid) # Identifies the Porting Order associated with the phone number block, id: str(uuid) # Identifies the phone number block to be deleted}\n@returns(200) {data: map{id: str(uuid), country_code: str, phone_number_type: str, phone_number_range: map{start_at: str, end_at: str}, activation_ranges: [map], record_type: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {404: Not found, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint GET /porting_orders/{porting_order_id}/phone_number_extensions\n@desc List all phone number extensions\n@required {porting_order_id: str(uuid) # Identifies the Porting Order associated with the phone number extensions}\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[porting_phone_number_id], sort: map # Consolidated sort parameter (deepObject style). Originally: sort[value]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {401: Unauthorized, 404: Not found, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint POST /porting_orders/{porting_order_id}/phone_number_extensions\n@desc Create a phone number extension\n@required {porting_order_id: str(uuid) # Identifies the Porting Order associated with the phone number extension, porting_phone_number_id: str(uuid) # Identifies the porting phone number associated with this porting phone number extension., extension_range: map{start_at!: int, end_at!: int}, activation_ranges: [map{start_at!: int, end_at!: int}] # Specifies the activation ranges for this porting phone number extension. The activation range must be within the extension range and should not overlap with other activation ranges.}\n@returns(201) {data: map{id: str(uuid), porting_phone_number_id: str(uuid), extension_range: map{start_at: int, end_at: int}, activation_ranges: [map], record_type: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {404: Not found, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint DELETE /porting_orders/{porting_order_id}/phone_number_extensions/{id}\n@desc Delete a phone number extension\n@required {porting_order_id: str(uuid) # Identifies the Porting Order associated with the phone number extension, id: str(uuid) # Identifies the phone number extension to be deleted}\n@returns(200) {data: map{id: str(uuid), porting_phone_number_id: str(uuid), extension_range: map{start_at: int, end_at: int}, activation_ranges: [map], record_type: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {404: Not found, 422: Unprocessable entity. Check message field in response for details.}\n\n@endgroup\n\n@group porting_phone_numbers\n@endpoint GET /porting_phone_numbers\n@desc List all porting phone numbers\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[porting_order_status]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {401: Unauthorized, 422: Unprocessable entity. Check message field in response for details.}\n\n@endgroup\n\n@group portouts\n@endpoint GET /portouts\n@desc List portout requests\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[carrier_name], filter[country_code], filter[country_code_in], filter[foc_date], filter[inserted_at], filter[phone_number], filter[pon], filter[ported_out_at], filter[spid], filter[status], filter[status_in], filter[support_key]}\n@returns(200) {data: [map], meta: map{total_pages: num(integer), total_results: num(integer), page_number: num(integer), page_size: num(integer)}} # Portout Response\n@errors {401: Unauthorized, 404: Resource not found, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint GET /portouts/events\n@desc List all port-out events\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[event_type], filter[portout_id], filter[created_at]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unprocessable entity. Check message field in response for details., 500: Internal server error}\n\n@endpoint GET /portouts/events/{id}\n@desc Show a port-out event\n@required {id: str(uuid) # Identifies the port-out event.}\n@returns(200) {data: map} # Successful response\n@errors {404: Not found, 500: Internal server error}\n\n@endpoint POST /portouts/events/{id}/republish\n@desc Republish a port-out event\n@required {id: str(uuid) # Identifies the port-out event.}\n@returns(204) No content\n@errors {404: Not found, 500: Internal server error}\n\n@endpoint GET /portouts/rejections/{portout_id}\n@desc List eligible port-out rejection codes for a specific order\n@required {portout_id: str # Identifies a port out order.}\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[code], filter[code][in]}\n@returns(200) {data: [map]} # Successful response\n@errors {404: Resource not found, 422: Unprocessable entity. Check message field in response for details., 500: Internal server error}\n\n@endpoint GET /portouts/reports\n@desc List port-out related reports\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[report_type], filter[status]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unprocessable entity. Check message field in response for details., 500: Internal server error}\n\n@endpoint POST /portouts/reports\n@desc Create a port-out related report\n@required {report_type: str # Identifies the type of report, params: any}\n@returns(201) {data: map{id: str(uuid), report_type: str, status: str, params: any, document_id: str(uuid), record_type: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {422: Unprocessable entity. Check message field in response for details., 500: Internal server error}\n\n@endpoint GET /portouts/reports/{id}\n@desc Retrieve a report\n@required {id: str(uuid) # Identifies a report.}\n@returns(200) {data: map{id: str(uuid), report_type: str, status: str, params: any, document_id: str(uuid), record_type: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {404: Resource not found, 500: Internal server error}\n\n@endpoint GET /portouts/{id}\n@desc Get a portout request\n@required {id: str(uuid) # Portout id}\n@returns(200) {data: map{id: str, record_type: str, phone_numbers: [str], authorized_name: str, carrier_name: str, current_carrier: str, end_user_name: str, city: str, state: str, zip: str, lsr: [str(uri)], pon: str, reason: str?, rejection_code: int, service_address: str, foc_date: str, requested_foc_date: str, spid: str, support_key: str, status: str, already_ported: bool, user_id: str(uuid), vendor: str(uuid), created_at: str, inserted_at: str, updated_at: str, host_messaging: bool}} # Portout Response\n@errors {401: Unauthorized, 404: Resource not found, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint GET /portouts/{id}/comments\n@desc List all comments for a portout request\n@required {id: str(uuid) # Portout id}\n@returns(200) {data: [map], meta: map{total_pages: num(integer), total_results: num(integer), page_number: num(integer), page_size: num(integer)}} # Portout Comments\n@errors {401: Unauthorized, 404: Resource not found, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint POST /portouts/{id}/comments\n@desc Create a comment on a portout request\n@required {id: str(uuid) # Portout id}\n@optional {body: str # Comment to post on this portout request}\n@returns(201) {data: map{id: str, record_type: str, body: str, portout_id: str, user_id: str, created_at: str}} # Portout Comment Response\n@errors {401: Unauthorized, 404: Resource not found, 422: Unprocessable entity. Check message field in response for details.}\n@example_request {\"body\":\"string\"}\n\n@endpoint GET /portouts/{id}/supporting_documents\n@desc List supporting documents on a portout request\n@required {id: str(uuid) # Portout id}\n@returns(201) {data: [map]} # Portout Supporting Documents\n@errors {401: Unauthorized, 404: Resource not found}\n\n@endpoint POST /portouts/{id}/supporting_documents\n@desc Create a list of supporting documents on a portout request\n@required {id: str(uuid) # Portout id}\n@optional {documents: [map{type!: str, document_id!: str(uuid)}] # List of supporting documents parameters}\n@returns(201) {data: [map]} # Portout Supporting Documents\n@errors {401: Unauthorized, 404: Resource not found, 422: Unprocessable entity. Check message field in response for details.}\n\n@endpoint PATCH /portouts/{id}/{status}\n@desc Update Status\n@required {id: str(uuid) # Portout id, status: str(authorized/rejected-pending) # Updated portout status, reason: str # Provide a reason if rejecting the port out request}\n@optional {host_messaging: bool=false # Indicates whether messaging services should be maintained with Telnyx after the port out completes}\n@returns(200) {data: map{id: str, record_type: str, phone_numbers: [str], authorized_name: str, carrier_name: str, current_carrier: str, end_user_name: str, city: str, state: str, zip: str, lsr: [str(uri)], pon: str, reason: str?, rejection_code: int, service_address: str, foc_date: str, requested_foc_date: str, spid: str, support_key: str, status: str, already_ported: bool, user_id: str(uuid), vendor: str(uuid), created_at: str, inserted_at: str, updated_at: str, host_messaging: bool}} # Portout Response\n@errors {401: Unauthorized, 404: Resource not found, 422: Unprocessable entity. Check message field in response for details.}\n\n@endgroup\n\n@group pricing\n@endpoint GET /pricing/products\n@desc List products\n@optional {page[number]: int=1: any # Page number (1-based)., page[size]: int=20 # Number of items per page (max 100).}\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_pages: int, total_results: int}} # Product catalog listing\n@errors {400: Invalid pagination parameters}\n\n@endpoint GET /pricing/products/{slug}\n@desc Get product pricing\n@required {slug: str # Product slug from the catalog listing.}\n@optional {page[number]: int=1: any # Page number (1-based)., page[size]: int=20 # Number of items per page (max 100)., filter[country_iso]: any # Two-letter ISO 3166-1 alpha-2 country code (uppercase, e.g. US) to filter pricing to a single country.}\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_pages: int, total_results: int}} # Product pricing entries\n@errors {404: Product not found}\n\n@endgroup\n\n@group private_wireless_gateways\n@endpoint GET /private_wireless_gateways\n@desc Get all Private Wireless Gateways\n@optional {page[number]: int=1: any # The page number to load., page[size]: int=20 # The size of the page., filter[name]: str # The name of the Private Wireless Gateway., filter[ip_range]: str # The IP address range of the Private Wireless Gateway., filter[region_code]: str # The name of the region where the Private Wireless Gateway is deployed., filter[created_at]: str # Private Wireless Gateway resource creation date., filter[updated_at]: str # When the Private Wireless Gateway was last updated.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {401: Unauthorized}\n\n@endpoint POST /private_wireless_gateways\n@desc Create a Private Wireless Gateway\n@required {network_id: str(uuid) # The identification of the related network resource., name: str # The private wireless gateway name.}\n@optional {region_code: str # The code of the region where the private wireless gateway will be assigned. A list of available regions can be found at the regions endpoint, address_mode: str(static/dynamic)=dynamic # Determines how IP addresses are assigned to SIM cards using this gateway. With static, each SIM card gets a fixed IP address from the gateway's IP range that is preserved across sessions. With dynamic, an IP address is assigned by the network at attach time and may change between sessions. If omitted, the gateway is created with the default address mode, dynamic.}\n@returns(202) {data: map{id: str(uuid), network_id: str(uuid), record_type: str, created_at: str, updated_at: str, name: str, address_mode: str, region_code: str, status: map{value: str, error_description: str?, error_code: str?}, ip_range: str, assigned_resources: [map]}} # Creation request accepted. Provisioning is asynchronous; poll GET /private_wireless_gateways/{id} with the returned id to check status.\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint DELETE /private_wireless_gateways/{id}\n@desc Delete a Private Wireless Gateway\n@required {id: str(uuid) # Identifies the private wireless gateway.}\n@returns(200) {data: map{id: str(uuid), network_id: str(uuid), record_type: str, created_at: str, updated_at: str, name: str, address_mode: str, region_code: str, status: map{value: str, error_description: str?, error_code: str?}, ip_range: str, assigned_resources: [map]}} # Successful Response\n@errors {404: Resource not found}\n\n@endpoint GET /private_wireless_gateways/{id}\n@desc Get a Private Wireless Gateway\n@required {id: str(uuid) # Identifies the private wireless gateway.}\n@returns(200) {data: map{id: str(uuid), network_id: str(uuid), record_type: str, created_at: str, updated_at: str, name: str, address_mode: str, region_code: str, status: map{value: str, error_description: str?, error_code: str?}, ip_range: str, assigned_resources: [map]}} # Successful Response\n@errors {404: Resource not found}\n\n@endgroup\n\n@group pronunciation_dicts\n@endpoint GET /pronunciation_dicts\n@desc List pronunciation dictionaries\n@optional {page[number]: int=1: any # Page number (1-based). Defaults to 1., page[size]: int=20 # Number of results per page. Defaults to 20, maximum 250.}\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_results: int, total_pages: int}} # A paginated list of pronunciation dictionaries.\n@errors {400: Invalid pagination parameters., 401: Unauthorized. Invalid or missing API key.}\n\n@endpoint POST /pronunciation_dicts\n@desc Create a pronunciation dictionary\n@required {name: str # Human-readable name. Must be unique within the organization., items: [any] # List of pronunciation items (alias or phoneme type). At least one item is required.}\n@returns(201) {data: map{record_type: str, id: str(uuid), name: str, items: [any], version: int, created_at: str(date-time), updated_at: str(date-time)}} # Pronunciation dictionary created successfully.\n@errors {401: Unauthorized. Invalid or missing API key., 422: Validation error or organization limit exceeded.}\n\n@endpoint DELETE /pronunciation_dicts/{id}\n@desc Delete a pronunciation dictionary\n@required {id: str(uuid) # The UUID of the pronunciation dictionary.}\n@returns(204) Dictionary deleted successfully. No content returned.\n@errors {401: Unauthorized. Invalid or missing API key., 404: Pronunciation dictionary not found.}\n\n@endpoint GET /pronunciation_dicts/{id}\n@desc Get a pronunciation dictionary\n@required {id: str(uuid) # The UUID of the pronunciation dictionary.}\n@returns(200) {data: map{record_type: str, id: str(uuid), name: str, items: [any], version: int, created_at: str(date-time), updated_at: str(date-time)}} # The requested pronunciation dictionary.\n@errors {401: Unauthorized. Invalid or missing API key., 404: Pronunciation dictionary not found.}\n\n@endpoint PATCH /pronunciation_dicts/{id}\n@desc Update a pronunciation dictionary\n@required {id: str(uuid) # The UUID of the pronunciation dictionary.}\n@optional {name: str # Updated dictionary name., items: [any] # Updated list of pronunciation items (alias or phoneme type).}\n@returns(200) {data: map{record_type: str, id: str(uuid), name: str, items: [any], version: int, created_at: str(date-time), updated_at: str(date-time)}} # Pronunciation dictionary updated successfully.\n@errors {401: Unauthorized. Invalid or missing API key., 404: Pronunciation dictionary not found., 409: Conflict. The dictionary was modified concurrently. Re-fetch and retry., 422: Validation error.}\n\n@endgroup\n\n@group public_internet_gateways\n@endpoint GET /public_internet_gateways\n@desc List all Public Internet Gateways\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[network_id], page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [any], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint POST /public_internet_gateways\n@desc Create a Public Internet Gateway\n@returns(202) {data: any} # Creation request accepted. Provisioning is asynchronous; poll GET /public_internet_gateways/{id} with the returned id to check status.\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint DELETE /public_internet_gateways/{id}\n@desc Delete a Public Internet Gateway\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint GET /public_internet_gateways/{id}\n@desc Retrieve a Public Internet Gateway\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unexpected error}\n\n@endgroup\n\n@group queues\n@endpoint GET /queues\n@desc List queues\n@optional {page[number]: int=1: any # The page number to load, page[size]: int=20 # The size of the page}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of queues.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint POST /queues\n@desc Create a queue\n@required {queue_name: str # The name of the queue. Must be between 1 and 255 characters.}\n@optional {max_size: int=300 # The maximum number of calls allowed in the queue.}\n@returns(200) {data: map{record_type: str, id: str, name: str, created_at: str, updated_at: str, current_size: int, max_size: int, average_wait_time_secs: int}} # Successful response with details about a queue.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint DELETE /queues/{queue_name}\n@desc Delete a queue\n@required {queue_name: str # Uniquely identifies the queue by name}\n@returns(204) Queue deleted successfully.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found.}\n\n@endpoint GET /queues/{queue_name}\n@desc Retrieve a call queue\n@required {queue_name: str # Uniquely identifies the queue by name}\n@returns(200) {data: map{record_type: str, id: str, name: str, created_at: str, updated_at: str, current_size: int, max_size: int, average_wait_time_secs: int}} # Successful response with details about a queue.\n@errors {404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found.}\n\n@endpoint POST /queues/{queue_name}\n@desc Update a queue\n@required {queue_name: str # Uniquely identifies the queue by name, max_size: int # The maximum number of calls allowed in the queue.}\n@returns(200) {data: map{record_type: str, id: str, name: str, created_at: str, updated_at: str, current_size: int, max_size: int, average_wait_time_secs: int}} # Successful response with details about a queue.\n@errors {401: Unauthorized. Authentication failed - the required authentication headers were either invalid or not included in the request., 404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values, call state errors, conference errors, queue errors, recording/transcription errors, and business logic violations.}\n\n@endpoint GET /queues/{queue_name}/calls\n@desc Retrieve calls from a queue\n@required {queue_name: str # Uniquely identifies the queue by name}\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[after], page[before], page[limit], page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of calls in a queue.\n@errors {404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found.}\n\n@endpoint DELETE /queues/{queue_name}/calls/{call_control_id}\n@desc Force remove a call from a queue\n@required {queue_name: str # Uniquely identifies the queue by name, call_control_id: str # Unique identifier and token for controlling the call}\n@returns(204) Call successfully removed from the queue\n@errors {404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found.}\n\n@endpoint GET /queues/{queue_name}/calls/{call_control_id}\n@desc Retrieve a call from a queue\n@required {queue_name: str # Uniquely identifies the queue by name, call_control_id: str # Unique identifier and token for controlling the call}\n@returns(200) {data: map{record_type: str, call_session_id: str, call_leg_id: str, call_control_id: str, connection_id: str, from: str, to: str, enqueued_at: str, wait_time_secs: int, queue_position: int, queue_id: str, is_alive: bool}} # Successful response with details about a call in a queue.\n@errors {404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found.}\n\n@endpoint PATCH /queues/{queue_name}/calls/{call_control_id}\n@desc Update queued call\n@required {queue_name: str # Uniquely identifies the queue by name, call_control_id: str # Unique identifier and token for controlling the call}\n@optional {keep_after_hangup: bool # Whether the call should remain in queue after hangup.}\n@returns(204) Call has been successfully updated.\n@errors {404: Resource not found. The requested resource does not exist. Common causes include: invalid call_control_id, conference not found, audio file not found, or recording not found.}\n\n@endgroup\n\n@group rcs\n@endpoint GET /rcs/agents\n@desc List RCS agents\n@optional {brand_id: str(uuid) # Only return agents belonging to this brand.}\n@returns(200) RCS agents owned by the organization.\n@errors {401: The request is not authenticated., 404: The resource does not exist, is not owned by the organization, or the provider does not support the requested capability., 422: The request body or parameters failed validation.}\n\n@endpoint POST /rcs/agents\n@desc Create an RCS agent\n@required {Idempotency-Key: str # A caller-generated key containing letters, numbers, underscores, or hyphens. Reuse the same key and request body when retrying the same logical agent creation., brand_id: str(uuid), display_name: str, use_case: str(MULTI_USE/PROMOTIONAL/TRANSACTIONAL/OTP), configuration: map{basics!: map, campaign: any, testing: any}}\n@optional {profile_id: str # A Messaging Profile owned by the authenticated organization. When omitted, the agent inherits the brand profile., hosting_region: str}\n@returns(201) {agent_id: str(uuid), brand_id: str(uuid), display_name: str, use_case: str, status: str, profile_id: str?, basics_status: any, campaign_status: any, testing_status: any, billing_category: any, hosting_region: str?, configuration: map{basics: map{description: str, logo_url: str(uri), hero_url: str(uri), brand_color: str, privacy_policy_url: str(uri), terms_and_conditions_url: str(uri), phone_number: any, website: any, email: any}, campaign: any, testing: any}, carrier_approvals: [map], test_devices: [map], capabilities: map{brand_entity: bool, brand_verification: bool, submission_sections: bool, distinct_launch_phase: bool, per_carrier_approval: bool, templates: bool, campaigns: bool, vendor_webhooks: bool, invite_test_devices: bool}} # The agent draft was created or replayed from the idempotency record.\n@errors {400: The request or idempotency header is malformed., 401: The request is not authenticated., 404: The resource does not exist, is not owned by the organization, or the provider does not support the requested capability., 409: The operation is not allowed in the current lifecycle state or the idempotency key was used for a different request., 422: The request body or parameters failed validation., 503: A registration dependency is temporarily unavailable.}\n\n@endpoint GET /rcs/agents/{id}\n@desc Retrieve an RCS agent\n@required {id: str(uuid) # The Telnyx-assigned agent identifier.}\n@returns(200) {agent_id: str(uuid), brand_id: str(uuid), display_name: str, use_case: str, status: str, profile_id: str?, basics_status: any, campaign_status: any, testing_status: any, billing_category: any, hosting_region: str?, configuration: map{basics: map{description: str, logo_url: str(uri), hero_url: str(uri), brand_color: str, privacy_policy_url: str(uri), terms_and_conditions_url: str(uri), phone_number: any, website: any, email: any}, campaign: any, testing: any}, carrier_approvals: [map], test_devices: [map], capabilities: map{brand_entity: bool, brand_verification: bool, submission_sections: bool, distinct_launch_phase: bool, per_carrier_approval: bool, templates: bool, campaigns: bool, vendor_webhooks: bool, invite_test_devices: bool}} # The requested RCS agent.\n@errors {401: The request is not authenticated., 404: The resource does not exist, is not owned by the organization, or the provider does not support the requested capability.}\n\n@endpoint PATCH /rcs/agents/{id}\n@desc Update an RCS agent\n@required {id: str(uuid) # The Telnyx-assigned agent identifier.}\n@optional {display_name: str, use_case: str(MULTI_USE/PROMOTIONAL/TRANSACTIONAL/OTP), profile_id: str, hosting_region: str, configuration: map{basics!: map, campaign: any, testing: any}}\n@returns(200) {agent_id: str(uuid), brand_id: str(uuid), display_name: str, use_case: str, status: str, profile_id: str?, basics_status: any, campaign_status: any, testing_status: any, billing_category: any, hosting_region: str?, configuration: map{basics: map{description: str, logo_url: str(uri), hero_url: str(uri), brand_color: str, privacy_policy_url: str(uri), terms_and_conditions_url: str(uri), phone_number: any, website: any, email: any}, campaign: any, testing: any}, carrier_approvals: [map], test_devices: [map], capabilities: map{brand_entity: bool, brand_verification: bool, submission_sections: bool, distinct_launch_phase: bool, per_carrier_approval: bool, templates: bool, campaigns: bool, vendor_webhooks: bool, invite_test_devices: bool}} # The updated RCS agent.\n@errors {401: The request is not authenticated., 404: The resource does not exist, is not owned by the organization, or the provider does not support the requested capability., 409: The operation is not allowed in the current lifecycle state or the idempotency key was used for a different request., 422: The request body or parameters failed validation., 503: A registration dependency is temporarily unavailable.}\n\n@endpoint GET /rcs/agents/{id}/carrier_approvals\n@desc List RCS agent carrier approvals\n@required {id: str(uuid) # The Telnyx-assigned agent identifier.}\n@returns(200) Carrier approval records for the agent.\n@errors {401: The request is not authenticated., 404: The resource does not exist, is not owned by the organization, or the provider does not support the requested capability.}\n\n@endpoint POST /rcs/agents/{id}/launch\n@desc Submit an RCS agent for launch\n@required {id: str(uuid) # The Telnyx-assigned agent identifier., campaign: any, testing: map{test_url!: str(uri), message_id: str, additional_information: str}}\n@returns(202) {agent_id: str(uuid), brand_id: str(uuid), display_name: str, use_case: str, status: str, profile_id: str?, basics_status: any, campaign_status: any, testing_status: any, billing_category: any, hosting_region: str?, configuration: map{basics: map{description: str, logo_url: str(uri), hero_url: str(uri), brand_color: str, privacy_policy_url: str(uri), terms_and_conditions_url: str(uri), phone_number: any, website: any, email: any}, campaign: any, testing: any}, carrier_approvals: [map], test_devices: [map], capabilities: map{brand_entity: bool, brand_verification: bool, submission_sections: bool, distinct_launch_phase: bool, per_carrier_approval: bool, templates: bool, campaigns: bool, vendor_webhooks: bool, invite_test_devices: bool}} # The launch submission was accepted.\n@errors {401: The request is not authenticated., 404: The resource does not exist, is not owned by the organization, or the provider does not support the requested capability., 409: The operation is not allowed in the current lifecycle state or the idempotency key was used for a different request., 422: The request body or parameters failed validation.}\n\n@endpoint POST /rcs/agents/{id}/submit\n@desc Submit RCS agent basics\n@required {id: str(uuid) # The Telnyx-assigned agent identifier.}\n@returns(202) {agent_id: str(uuid), brand_id: str(uuid), display_name: str, use_case: str, status: str, profile_id: str?, basics_status: any, campaign_status: any, testing_status: any, billing_category: any, hosting_region: str?, configuration: map{basics: map{description: str, logo_url: str(uri), hero_url: str(uri), brand_color: str, privacy_policy_url: str(uri), terms_and_conditions_url: str(uri), phone_number: any, website: any, email: any}, campaign: any, testing: any}, carrier_approvals: [map], test_devices: [map], capabilities: map{brand_entity: bool, brand_verification: bool, submission_sections: bool, distinct_launch_phase: bool, per_carrier_approval: bool, templates: bool, campaigns: bool, vendor_webhooks: bool, invite_test_devices: bool}} # The basic agent submission was accepted.\n@errors {401: The request is not authenticated., 404: The resource does not exist, is not owned by the organization, or the provider does not support the requested capability., 409: The operation is not allowed in the current lifecycle state or the idempotency key was used for a different request.}\n\n@endpoint GET /rcs/agents/{id}/test_devices\n@desc List RCS agent test devices\n@required {id: str(uuid) # The Telnyx-assigned agent identifier.}\n@returns(200) Test devices attached to the agent.\n@errors {401: The request is not authenticated., 404: The resource does not exist, is not owned by the organization, or the provider does not support the requested capability.}\n\n@endpoint POST /rcs/agents/{id}/test_devices\n@desc Add an RCS agent test device\n@required {id: str(uuid) # The Telnyx-assigned agent identifier., phone_number: str}\n@returns(201) {test_device_id: str(uuid), phone_number: str, invite_status: str} # The test device was added or already existed.\n@errors {401: The request is not authenticated., 404: The resource does not exist, is not owned by the organization, or the provider does not support the requested capability., 409: The operation is not allowed in the current lifecycle state or the idempotency key was used for a different request., 422: The request body or parameters failed validation., 502: The RCS provider rejected or could not complete the request.}\n\n@endpoint DELETE /rcs/agents/{id}/test_devices/{test_device_id}\n@desc Remove an RCS agent test device\n@required {id: str(uuid) # The Telnyx-assigned agent identifier., test_device_id: str(uuid) # The Telnyx-assigned test device identifier.}\n@returns(204) The test device was removed.\n@errors {401: The request is not authenticated., 404: The resource does not exist, is not owned by the organization, or the provider does not support the requested capability., 502: The RCS provider rejected or could not complete the request.}\n\n@endpoint GET /rcs/brands\n@desc List RCS brands\n@returns(200) RCS brands owned by the organization.\n@errors {401: The request is not authenticated.}\n\n@endpoint POST /rcs/brands\n@desc Create an RCS brand\n@required {display_name: str, legal_name: str, legal_entity_type: str(LIMITED_LIABILITY_COMPANY/SOLE_PROPRIETORSHIP/PARTNERSHIP/CORPORATION/S_CORPORATION), organization_type: str(PRIVATE_PROFIT/PUBLIC_PROFIT/NON_PROFIT/GOVERNMENT/UNKNOWN), website_url: str(uri), identifiers: map{ein!: map, stock_symbol: map} # Named business identifiers. Use the `ein` key for the required EIN and `stock_symbol` for a public-profit brand's stock symbol., addresses: map, contacts: map{brand!: any} # Named business contacts. Use the `brand` key for the required BRAND contact.}\n@optional {profile_id: str # A Messaging Profile owned by the authenticated organization. Agents inherit this value when they do not provide their own profile.}\n@returns(201) {brand_id: str(uuid), display_name: str, legal_name: str, legal_entity_type: str, organization_type: str, website_url: str(uri), status: str, profile_id: str?, identifiers: map, addresses: map, contacts: map, capabilities: map{brand_entity: bool, brand_verification: bool, submission_sections: bool, distinct_launch_phase: bool, per_carrier_approval: bool, templates: bool, campaigns: bool, vendor_webhooks: bool, invite_test_devices: bool}} # The brand draft was created.\n@errors {401: The request is not authenticated., 409: The operation is not allowed in the current lifecycle state or the idempotency key was used for a different request., 422: The request body or parameters failed validation., 503: A registration dependency is temporarily unavailable.}\n\n@endpoint GET /rcs/brands/{id}\n@desc Retrieve an RCS brand\n@required {id: str(uuid) # The Telnyx-assigned brand identifier.}\n@returns(200) {brand_id: str(uuid), display_name: str, legal_name: str, legal_entity_type: str, organization_type: str, website_url: str(uri), status: str, profile_id: str?, identifiers: map, addresses: map, contacts: map, capabilities: map{brand_entity: bool, brand_verification: bool, submission_sections: bool, distinct_launch_phase: bool, per_carrier_approval: bool, templates: bool, campaigns: bool, vendor_webhooks: bool, invite_test_devices: bool}} # The requested RCS brand.\n@errors {401: The request is not authenticated., 404: The resource does not exist, is not owned by the organization, or the provider does not support the requested capability.}\n\n@endpoint PATCH /rcs/brands/{id}\n@desc Update an RCS brand\n@required {id: str(uuid) # The Telnyx-assigned brand identifier.}\n@optional {display_name: str, legal_name: str, legal_entity_type: str(LIMITED_LIABILITY_COMPANY/SOLE_PROPRIETORSHIP/PARTNERSHIP/CORPORATION/S_CORPORATION), organization_type: str(PRIVATE_PROFIT/PUBLIC_PROFIT/NON_PROFIT/GOVERNMENT/UNKNOWN), website_url: str(uri), profile_id: str, identifiers: map{ein!: map, stock_symbol: map} # Named business identifiers. Use the `ein` key for the required EIN and `stock_symbol` for a public-profit brand's stock symbol., addresses: map, contacts: map{brand!: any} # Named business contacts. Use the `brand` key for the required BRAND contact.}\n@returns(200) {brand_id: str(uuid), display_name: str, legal_name: str, legal_entity_type: str, organization_type: str, website_url: str(uri), status: str, profile_id: str?, identifiers: map, addresses: map, contacts: map, capabilities: map{brand_entity: bool, brand_verification: bool, submission_sections: bool, distinct_launch_phase: bool, per_carrier_approval: bool, templates: bool, campaigns: bool, vendor_webhooks: bool, invite_test_devices: bool}} # The updated RCS brand.\n@errors {401: The request is not authenticated., 404: The resource does not exist, is not owned by the organization, or the provider does not support the requested capability., 409: The operation is not allowed in the current lifecycle state or the idempotency key was used for a different request., 422: The request body or parameters failed validation., 503: A registration dependency is temporarily unavailable.}\n\n@endpoint POST /rcs/brands/{id}/submit\n@desc Submit an RCS brand\n@required {id: str(uuid) # The Telnyx-assigned brand identifier.}\n@returns(202) {brand_id: str(uuid), display_name: str, legal_name: str, legal_entity_type: str, organization_type: str, website_url: str(uri), status: str, profile_id: str?, identifiers: map, addresses: map, contacts: map, capabilities: map{brand_entity: bool, brand_verification: bool, submission_sections: bool, distinct_launch_phase: bool, per_carrier_approval: bool, templates: bool, campaigns: bool, vendor_webhooks: bool, invite_test_devices: bool}} # The brand submission was accepted.\n@errors {401: The request is not authenticated., 404: The resource does not exist, is not owned by the organization, or the provider does not support the requested capability., 409: The operation is not allowed in the current lifecycle state or the idempotency key was used for a different request.}\n\n@endgroup\n\n@group recording_transcriptions\n@endpoint GET /recording_transcriptions\n@desc List all recording transcriptions\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Filter recording transcriptions by various attributes.}\n@returns(200) {data: [map], meta: map{cursors: map{after: str, before: str}, next: str, previous: str}} # A response listing multiple recording transcriptions.\n@errors {401: Unauthorized. The request lacks valid authentication credentials., 404: Resource not found. The requested resource or URL could not be found.}\n\n@endpoint DELETE /recording_transcriptions/{recording_transcription_id}\n@desc Delete a recording transcription\n@required {recording_transcription_id: str(uuid) # Uniquely identifies the recording transcription by id.}\n@returns(200) {data: map{created_at: str, duration_millis: int(int32), id: str, recording_id: str, record_type: str, status: str, transcription_text: str, updated_at: str}} # A response with a single recording transcription resource.\n@errors {401: Unauthorized. The request lacks valid authentication credentials., 404: Resource not found. The requested resource or URL could not be found.}\n\n@endpoint GET /recording_transcriptions/{recording_transcription_id}\n@desc Retrieve a recording transcription\n@required {recording_transcription_id: str(uuid) # Uniquely identifies the recording transcription by id.}\n@returns(200) {data: map{created_at: str, duration_millis: int(int32), id: str, recording_id: str, record_type: str, status: str, transcription_text: str, updated_at: str}} # A response with a single recording transcription resource.\n@errors {401: Unauthorized. The request lacks valid authentication credentials., 404: Resource not found. The requested resource or URL could not be found.}\n\n@endgroup\n\n@group recordings\n@endpoint GET /recordings\n@desc List all call recordings\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Filter recordings by various attributes.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # A response containing multiple recordings.\n@errors {401: Unauthorized. The request lacks valid authentication credentials., 403: Forbidden. The request is understood but has been refused., 404: Resource not found. The requested resource or URL could not be found., 500: Internal server error. An unexpected error occurred on the server.}\n\n@endpoint POST /recordings/actions/delete\n@desc Delete a list of call recordings\n@required {ids: [str] # List of call recording IDs to delete.}\n@returns(200) {status: str} # The recordings have been successfully deleted.\n@errors {401: Unauthorized. The request lacks valid authentication credentials., 404: Resource not found. The requested resource or URL could not be found.}\n@example_request {\"ids\":[\"428c31b6-7af4-4bcb-b7f5-5013ef9657c1\",\"428c31b6-7af4-4bcb-b7f5-5013ef9657c2\"]}\n\n@endpoint DELETE /recordings/{recording_id}\n@desc Delete a call recording\n@required {recording_id: str # Uniquely identifies the recording by id.}\n@returns(200) {data: map{call_control_id: str, call_leg_id: str, call_session_id: str, channels: str, conference_id: str, created_at: str, download_urls: map{mp3: str, wav: str}, duration_millis: int(int32), id: str, record_type: str, recording_started_at: str, recording_ended_at: str, source: str, status: str, from: str, to: str, connection_id: str, initiated_by: str, updated_at: str}} # A response with a single recording resource.\n@errors {401: Unauthorized. The request lacks valid authentication credentials., 404: Resource not found. The requested resource or URL could not be found.}\n\n@endpoint GET /recordings/{recording_id}\n@desc Retrieve a call recording\n@required {recording_id: str # Uniquely identifies the recording by id.}\n@returns(200) {data: map{call_control_id: str, call_leg_id: str, call_session_id: str, channels: str, conference_id: str, created_at: str, download_urls: map{mp3: str, wav: str}, duration_millis: int(int32), id: str, record_type: str, recording_started_at: str, recording_ended_at: str, source: str, status: str, from: str, to: str, connection_id: str, initiated_by: str, updated_at: str}} # A response with a single recording resource.\n@errors {401: Unauthorized. The request lacks valid authentication credentials., 404: Resource not found. The requested resource or URL could not be found.}\n\n@endgroup\n\n@group regions\n@endpoint GET /regions\n@desc List all Regions\n@returns(200) {data: [map]} # Successful response\n@errors {422: Unexpected error}\n\n@endgroup\n\n@group regulatory_requirements\n@endpoint GET /regulatory_requirements\n@desc Retrieve regulatory requirements\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[phone_number], filter[requirement_group_id], filter[country_code], filter[phone_number_type], filter[action]}\n@returns(200) {data: [map]} # An array of Regulatory Requirements Responses\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group reports\n@endpoint GET /reports/cdr_usage_reports/sync\n@desc Generates and fetches CDR Usage Reports\n@required {aggregation_type: str(NO_AGGREGATION/CONNECTION/TAG/BILLING_GROUP) # Type of aggregation to apply to the results., product_breakdown: str(NO_BREAKDOWN/DID_VS_TOLL_FREE/COUNTRY/DID_VS_TOLL_FREE_PER_COUNTRY) # Filter results by product breakdown.}\n@optional {start_date: str(date-time) # Start of the date range filter (inclusive, ISO 8601)., end_date: str(date-time) # End of the date range filter (inclusive, ISO 8601)., connections: [num] # Filter results by connection.}\n@returns(200) {data: map{id: str(uuid), start_time: str(date-time), end_time: str(date-time), connections: [int(int64)], aggregation_type: str, status: str, report_url: str, result: map, created_at: str(date-time), updated_at: str(date-time), record_type: str, product_breakdown: str}} # Successful\n@errors {400: Bad Request}\n\n@endpoint GET /reports/mdr_usage_reports\n@desc Fetch all Messaging usage reports\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int(int32), total_results: int(int32), page_number: int(int32), page_size: int(int32)}} # Successful\n@errors {400: Bad Request}\n\n@endpoint POST /reports/mdr_usage_reports\n@desc Create MDR Usage Report\n@returns(200) {data: map{id: str(uuid), start_date: str(date-time), end_date: str(date-time), connections: [int(int64)], aggregation_type: str, status: str, report_url: str, result: [map], created_at: str(date-time), updated_at: str(date-time), profiles: str, record_type: str}} # Successful\n@errors {400: Bad Request}\n\n@endpoint GET /reports/mdr_usage_reports/sync\n@desc Generate and fetch MDR Usage Report\n@required {aggregation_type: str(NO_AGGREGATION/PROFILE/TAGS) # Type of aggregation to apply to the results.}\n@optional {start_date: str(date-time) # Start of the date range filter (inclusive, ISO 8601)., end_date: str(date-time) # End of the date range filter (inclusive, ISO 8601)., profiles: [str] # Filter results by profile.}\n@returns(200) {data: map{id: str(uuid), start_date: str(date-time), end_date: str(date-time), connections: [int(int64)], aggregation_type: str, status: str, report_url: str, result: [map], created_at: str(date-time), updated_at: str(date-time), profiles: str, record_type: str}} # Successful\n@errors {400: Bad Request}\n\n@endpoint DELETE /reports/mdr_usage_reports/{id}\n@desc Delete MDR Usage Report\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {data: map{id: str(uuid), start_date: str(date-time), end_date: str(date-time), connections: [int(int64)], aggregation_type: str, status: str, report_url: str, result: [map], created_at: str(date-time), updated_at: str(date-time), profiles: str, record_type: str}} # Successful\n@errors {400: Bad Request}\n\n@endpoint GET /reports/mdr_usage_reports/{id}\n@desc Retrieve messaging report\n@required {id: str(uuid) # Unique identifier of the resource.}\n@returns(200) {data: map{id: str(uuid), start_date: str(date-time), end_date: str(date-time), connections: [int(int64)], aggregation_type: str, status: str, report_url: str, result: [map], created_at: str(date-time), updated_at: str(date-time), profiles: str, record_type: str}} # Successful\n@errors {400: Bad Request}\n\n@endpoint GET /reports/mdrs\n@desc Fetch all Mdr records\n@optional {start_date: str # Pagination start date, end_date: str # Pagination end date, id: str # Filter results by identifier., direction: str(INBOUND/OUTBOUND) # Filter results by direction., profile: str # Filter results by profile., cld: str # Filter results by cld., cli: str # Filter results by cli., status: str(GW_TIMEOUT/DELIVERED/DLR_UNCONFIRMED/DLR_TIMEOUT/RECEIVED/GW_REJECT/FAILED) # Filter results by status., message_type: str(SMS/MMS) # Filter results by message type.}\n@returns(200) {data: [map], meta: map{total_pages: int(int32), total_results: int(int32), page_number: int(int32), page_size: int(int32)}} # Successful\n@errors {400: Bad Request}\n\n@endpoint GET /reports/wdrs\n@desc Fetches all Wdr records\n@optional {start_date: str # Start date, end_date: str # End date, id: str # Filter results by identifier., mcc: str # Filter results by mcc., mnc: str # Filter results by mnc., imsi: str # Filter results by imsi., sim_group_name: str # Filter results by sim group name., sim_group_id: str # Filter results by sim group id., sim_card_id: str # Filter results by sim card id., phone_number: str # Filter results by phone number., sort: [str]=created_at # Field and direction to sort the results by., page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int(int32), total_results: int(int32), page_number: int(int32), page_size: int(int32)}} # Successful\n@errors {400: Bad Request}\n\n@endgroup\n\n@group reputation\n@endpoint GET /reputation/numbers\n@desc List reputation-monitored phone numbers across all enterprises\n@optional {page[number]: int=1: any # 1-based page number. Out-of-range values return an empty page with correct meta., page[size]: int=20 # Items per page. Maximum 250; values above are clamped to 250., filter[phone_number][contains]: str # Partial match on phone number. Must contain at least 5 digits., filter[enterprise_id]: str(uuid) # Filter by enterprise ID., filter[phone_number][eq]: str # Exact phone-number match (E.164).}\n@returns(200) Paginated list.\n@errors {401: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint DELETE /reputation/numbers/{phone_number}\n@desc Remove a phone number from reputation monitoring (no enterprise_id required)\n@required {phone_number: str # Phone number in E.164 format (`+1NPANXXXXXX` for US/CA). The leading `+` MUST be URL-encoded as `%2B` (e.g. `%2B19493253498`).}\n@returns(204) 204 (no body)\n@errors {401: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint GET /reputation/numbers/{phone_number}\n@desc Get a reputation-monitored number (no enterprise_id required)\n@required {phone_number: str # Phone number in E.164 format (`+1NPANXXXXXX` for US/CA). The leading `+` MUST be URL-encoded as `%2B` (e.g. `%2B19493253498`).}\n@optional {fresh: bool=false # When true, fetches fresh reputation data (incurs API cost). When false (default), returns cached data.}\n@returns(200) {data: map{id: str(uuid), enterprise_id: str(uuid), phone_number: str, reputation_data: map{spam_risk: str?, spam_category: str?, maturity_score: int?, connection_score: int?, engagement_score: int?, sentiment_score: int?, last_refreshed_at: str(date-time)?}, created_at: str(date-time), updated_at: str(date-time)}} # Phone number with reputation data.\n@errors {401: An error occurred. The response carries the standard Telnyx error envelope., 404: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endgroup\n\n@group requirement_groups\n@endpoint GET /requirement_groups\n@desc List requirement groups\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[country_code], filter[phone_number_type], filter[action], filter[status], filter[customer_reference]}\n@returns(200) List requirement groups\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint POST /requirement_groups\n@desc Create a new requirement group\n@required {country_code: str # ISO alpha 2 country code, phone_number_type: str(local/toll_free/mobile/national/shared_cost), action: str(ordering/porting)}\n@optional {customer_reference: str, regulatory_requirements: [map{requirement_id: str, field_value: str}]}\n@returns(200) {id: str, country_code: str, phone_number_type: str, status: str, action: str, customer_reference: str, created_at: str(date-time), updated_at: str(date-time), record_type: str, regulatory_requirements: [map]} # Requirement group created\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint DELETE /requirement_groups/{id}\n@desc Delete a requirement group by ID\n@required {id: str # ID of the requirement group}\n@returns(200) {id: str, country_code: str, phone_number_type: str, status: str, action: str, customer_reference: str, created_at: str(date-time), updated_at: str(date-time), record_type: str, regulatory_requirements: [map]} # Deleted requirement group\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /requirement_groups/{id}\n@desc Get a single requirement group by ID\n@required {id: str # ID of the requirement group to retrieve}\n@returns(200) {id: str, country_code: str, phone_number_type: str, status: str, action: str, customer_reference: str, created_at: str(date-time), updated_at: str(date-time), record_type: str, regulatory_requirements: [map]} # A single requirement group\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint PATCH /requirement_groups/{id}\n@desc Update requirement values in requirement group\n@required {id: str # ID of the requirement group}\n@optional {customer_reference: str # Reference for the customer, regulatory_requirements: [map{requirement_id: str, field_value: str}]}\n@returns(200) {id: str, country_code: str, phone_number_type: str, status: str, action: str, customer_reference: str, created_at: str(date-time), updated_at: str(date-time), record_type: str, regulatory_requirements: [map]} # Updated requirement group\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint POST /requirement_groups/{id}/submit_for_approval\n@desc Submit a Requirement Group for Approval\n@required {id: str # ID of the requirement group to submit}\n@returns(200) {id: str, country_code: str, phone_number_type: str, status: str, action: str, customer_reference: str, created_at: str(date-time), updated_at: str(date-time), record_type: str, regulatory_requirements: [map]} # A single requirement group\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group requirement_types\n@endpoint GET /requirement_types\n@desc List all requirement types\n@optional {filter: map # Consolidated filter parameter for requirement types (deepObject style). Originally: filter[name], sort: [str] # Consolidated sort parameter for requirement types (deepObject style). Originally: sort[]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint GET /requirement_types/{id}\n@desc Retrieve a requirement types\n@required {id: str(uuid) # Uniquely identifies the requirement_type record}\n@returns(200) {data: map{acceptance_criteria: map{time_limit: str, locality_limit: str, acceptable_values: [str], max_length: int, min_length: int, acceptable_characters: str}, description: str, example: str, type: str, name: str, record_type: str, id: str(uuid), created_at: str, updated_at: str}} # Successful response\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endgroup\n\n@group requirements\n@endpoint GET /requirements\n@desc List all requirements\n@optional {filter: map # Consolidated filter parameter for requirements (deepObject style). Originally: filter[country_code], filter[phone_number_type], filter[action], sort: [str] # Consolidated sort parameter for requirements (deepObject style). Originally: sort[], page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], version: int # Filter by requirement version number. When omitted, returns the currently-active version.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint GET /requirements/{id}\n@desc Retrieve a document requirement\n@required {id: str(uuid) # Uniquely identifies the requirement_type record}\n@optional {version: int # Filter by requirement version number. When omitted, returns the currently-active version.}\n@returns(200) {data: map{record_type: str, country_code: str, locality: str, phone_number_type: str, action: str, requirement_types: [map], id: str(uuid), created_at: str, updated_at: str, version: int, effective_start_at: str(date-time)?, effective_end_at: str(date-time)?}} # Successful response\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint POST /requirements/{id}/versions\n@desc Schedule a future requirement version\n@required {id: str(uuid) # Uniquely identifies the requirement_type record, effective_start_at: str(date-time) # ISO 8601 formatted date-time indicating when the new version should become active. Must be a future date-time., requirement_type_ids: [str(uuid)] # List of requirement type UUIDs that apply to the new version. Replaces the existing requirement types for the new version.}\n@returns(201) {data: map{record_type: str, country_code: str, locality: str, phone_number_type: str, action: str, requirement_types: [map], id: str(uuid), created_at: str, updated_at: str, version: int, effective_start_at: str(date-time)?, effective_end_at: str(date-time)?}} # Pending version created successfully\n@errors {404: Resource not found, 422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint DELETE /requirements/{id}/versions/pending\n@desc Cancel a pending requirement version\n@required {id: str(uuid) # Uniquely identifies the requirement_type record}\n@returns(200) {data: map{cancelled: map{record_type: str, country_code: str, locality: str, phone_number_type: str, action: str, requirement_types: [map], id: str(uuid), created_at: str, updated_at: str, version: int, effective_start_at: str(date-time)?, effective_end_at: str(date-time)?}, restored: map{record_type: str, country_code: str, locality: str, phone_number_type: str, action: str, requirement_types: [map], id: str(uuid), created_at: str, updated_at: str, version: int, effective_start_at: str(date-time)?, effective_end_at: str(date-time)?}}} # Pending version cancelled successfully\n@errors {404: Resource not found, 422: Unprocessable entity. The specified requirement is not a pending version.}\n\n@endgroup\n\n@group room_compositions\n@endpoint GET /room_compositions\n@desc View a list of room compositions.\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[date_created_at][eq], filter[date_created_at][gte], filter[date_created_at][lte], filter[session_id], filter[status], page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # List room compositions response.\n@errors {4XX: Unexpected error}\n\n@endpoint POST /room_compositions\n@desc Create a room composition.\n@optional {format: str=mp4 # The desired format of the room composition., resolution: str=1280x720 # The desired resolution (width/height in pixels) of the resulting video of the room composition. Both width and height are required to be between 16 and 1280; and width * height should not exceed 1280 * 720, session_id: str(uuid) # id of the room session associated with the room composition., video_layout: map # Describes the video layout of the room composition in terms of regions., webhook_event_url: str(uri) # The URL where webhooks related to this room composition will be sent. Must include a scheme, such as 'https'., webhook_event_failover_url: str(uri)= # The failover URL where webhooks related to this room composition will be sent if sending to the primary URL fails. Must include a scheme, such as 'https'., webhook_timeout_secs: int=null # Specifies how many seconds to wait before timing out a webhook.}\n@returns(202) {data: map{id: str(uuid), room_id: str(uuid), session_id: str(uuid), user_id: str(uuid), status: str, size_mb: num(float), download_url: str, duration_secs: int, format: str, created_at: str(date-time), updated_at: str(date-time), ended_at: str(date-time), started_at: str(date-time), completed_at: str(date-time), video_layout: map, webhook_event_url: str(uri), webhook_event_failover_url: str(uri), webhook_timeout_secs: int, resolution: str, record_type: str}} # Composition request accepted. Poll GET /room_compositions/{room_composition_id} with the returned id until the composition completes.\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint DELETE /room_compositions/{room_composition_id}\n@desc Delete a room composition.\n@required {room_composition_id: str(uuid) # The unique identifier of a room composition.}\n@returns(204) The resource was deleted successfully.\n@errors {404: Resource not found}\n\n@endpoint GET /room_compositions/{room_composition_id}\n@desc View a room composition.\n@required {room_composition_id: str(uuid) # The unique identifier of a room composition.}\n@returns(200) {data: map{id: str(uuid), room_id: str(uuid), session_id: str(uuid), user_id: str(uuid), status: str, size_mb: num(float), download_url: str, duration_secs: int, format: str, created_at: str(date-time), updated_at: str(date-time), ended_at: str(date-time), started_at: str(date-time), completed_at: str(date-time), video_layout: map, webhook_event_url: str(uri), webhook_event_failover_url: str(uri), webhook_timeout_secs: int, resolution: str, record_type: str}} # Get room composition response.\n@errors {404: Resource not found}\n\n@endgroup\n\n@group room_participants\n@endpoint GET /room_participants\n@desc View a list of room participants.\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[date_joined_at][eq], filter[date_joined_at][gte], filter[date_joined_at][lte], filter[date_updated_at][eq], filter[date_updated_at][gte], filter[date_updated_at][lte], filter[date_left_at][eq], filter[date_left_at][gte], filter[date_left_at][lte], filter[context], filter[session_id], page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # List room participants response.\n@errors {4XX: Unexpected error}\n\n@endpoint GET /room_participants/{room_participant_id}\n@desc View a room participant.\n@required {room_participant_id: str(uuid) # The unique identifier of a room participant.}\n@returns(200) {data: map{id: str(uuid), session_id: str(uuid), context: str, joined_at: str(date-time), updated_at: str(date-time), left_at: str(date-time), record_type: str}} # Get room participant response.\n@errors {404: Resource not found}\n\n@endgroup\n\n@group room_recordings\n@endpoint DELETE /room_recordings\n@desc Delete several room recordings in a bulk.\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[date_ended_at][eq], filter[date_ended_at][gte], filter[date_ended_at][lte], filter[date_started_at][eq], filter[date_started_at][gte], filter[date_started_at][lte], filter[room_id], filter[participant_id], filter[session_id], filter[status], filter[type], filter[duration_secs], page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(201) {data: map{room_recordings: int}} # Successful response for Bulk Delete Room recordings requests\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint GET /room_recordings\n@desc View a list of room recordings.\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[date_ended_at][eq], filter[date_ended_at][gte], filter[date_ended_at][lte], filter[date_started_at][eq], filter[date_started_at][gte], filter[date_started_at][lte], filter[room_id], filter[participant_id], filter[session_id], filter[status], filter[type], filter[duration_secs], page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # List room recordings response.\n@errors {4XX: Unexpected error}\n\n@endpoint DELETE /room_recordings/{room_recording_id}\n@desc Delete a room recording.\n@required {room_recording_id: str(uuid) # The unique identifier of a room recording.}\n@returns(204) The resource was deleted successfully.\n@errors {404: Resource not found}\n\n@endpoint GET /room_recordings/{room_recording_id}\n@desc View a room recording.\n@required {room_recording_id: str(uuid) # The unique identifier of a room recording.}\n@returns(200) {data: map{id: str(uuid), room_id: str(uuid), session_id: str(uuid), participant_id: str(uuid), status: str, type: str, size_mb: num(float), download_url: str, codec: str, duration_secs: int, created_at: str(date-time), updated_at: str(date-time), ended_at: str(date-time), started_at: str(date-time), completed_at: str(date-time), record_type: str}} # Get room recording response.\n@errors {404: Resource not found}\n\n@endgroup\n\n@group room_sessions\n@endpoint GET /room_sessions\n@desc View a list of room sessions.\n@optional {include_participants: bool # To decide if room participants should be included in the response., filter: map # Consolidated filter parameter (deepObject style). Originally: filter[date_created_at][eq], filter[date_created_at][gte], filter[date_created_at][lte], filter[date_updated_at][eq], filter[date_updated_at][gte], filter[date_updated_at][lte], filter[date_ended_at][eq], filter[date_ended_at][gte], filter[date_ended_at][lte], filter[room_id], filter[active], page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # List room sessions response.\n@errors {4XX: Unexpected error}\n\n@endpoint GET /room_sessions/{room_session_id}\n@desc View a room session.\n@required {room_session_id: str(uuid) # The unique identifier of a room session.}\n@optional {include_participants: bool # To decide if room participants should be included in the response.}\n@returns(200) {data: map{id: str(uuid), room_id: str(uuid), active: bool, created_at: str(date-time), updated_at: str(date-time), ended_at: str(date-time), participants: [map], record_type: str}} # Get room session response.\n@errors {404: Resource not found}\n\n@endpoint POST /room_sessions/{room_session_id}/actions/end\n@desc End a room session.\n@required {room_session_id: str(uuid) # The unique identifier of a room session.}\n@returns(200) {data: map{result: str}} # Success Action Response\n@errors {4XX: Unexpected error}\n\n@endpoint POST /room_sessions/{room_session_id}/actions/kick\n@desc Kick participants from a room session.\n@required {room_session_id: str(uuid) # The unique identifier of a room session.}\n@optional {participants: any # Either a list of participant id to perform the action on, or the keyword \"all\" to perform the action on all participant., exclude: [str(uuid)] # List of participant id to exclude from the action.}\n@returns(200) {data: map{result: str}} # Success Action Response\n@errors {4XX: Unexpected error}\n\n@endpoint POST /room_sessions/{room_session_id}/actions/mute\n@desc Mute participants in room session.\n@required {room_session_id: str(uuid) # The unique identifier of a room session.}\n@optional {participants: any # Either a list of participant id to perform the action on, or the keyword \"all\" to perform the action on all participant., exclude: [str(uuid)] # List of participant id to exclude from the action.}\n@returns(200) {data: map{result: str}} # Success Action Response\n@errors {4XX: Unexpected error}\n\n@endpoint POST /room_sessions/{room_session_id}/actions/unmute\n@desc Unmute participants in room session.\n@required {room_session_id: str(uuid) # The unique identifier of a room session.}\n@optional {participants: any # Either a list of participant id to perform the action on, or the keyword \"all\" to perform the action on all participant., exclude: [str(uuid)] # List of participant id to exclude from the action.}\n@returns(200) {data: map{result: str}} # Success Action Response\n@errors {4XX: Unexpected error}\n\n@endpoint GET /room_sessions/{room_session_id}/participants\n@desc View a list of room participants.\n@required {room_session_id: str(uuid) # The unique identifier of a room session.}\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[date_joined_at][eq], filter[date_joined_at][gte], filter[date_joined_at][lte], filter[date_updated_at][eq], filter[date_updated_at][gte], filter[date_updated_at][lte], filter[date_left_at][eq], filter[date_left_at][gte], filter[date_left_at][lte], filter[context], page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # List room participants response.\n@errors {4XX: Unexpected error}\n\n@endgroup\n\n@group rooms\n@endpoint GET /rooms\n@desc View a list of rooms.\n@optional {include_sessions: bool # To decide if room sessions should be included in the response., filter: map # Consolidated filter parameter (deepObject style). Originally: filter[date_created_at][eq], filter[date_created_at][gte], filter[date_created_at][lte], filter[date_updated_at][eq], filter[date_updated_at][gte], filter[date_updated_at][lte], filter[unique_name], page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # List rooms response.\n@errors {4XX: Unexpected error}\n\n@endpoint POST /rooms\n@desc Create a room.\n@optional {unique_name: str # The unique (within the Telnyx account scope) name of the room., max_participants: int=10 # The maximum amount of participants allowed in a room. If new participants try to join after that limit is reached, their request will be rejected., enable_recording: bool=false # Enable or disable recording for that room., webhook_event_url: str(uri) # The URL where webhooks related to this room will be sent. Must include a scheme, such as 'https'., webhook_event_failover_url: str(uri)= # The failover URL where webhooks related to this room will be sent if sending to the primary URL fails. Must include a scheme, such as 'https'., webhook_timeout_secs: int=null # Specifies how many seconds to wait before timing out a webhook.}\n@returns(201) {data: map{id: str(uuid), max_participants: int, unique_name: str, created_at: str(date-time), updated_at: str(date-time), active_session_id: str(uuid), sessions: [map], enable_recording: bool, webhook_event_url: str(uri), webhook_event_failover_url: str(uri), webhook_timeout_secs: int, record_type: str}} # Create room response.\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint DELETE /rooms/{room_id}\n@desc Delete a room.\n@required {room_id: str(uuid) # The unique identifier of a room.}\n@returns(204) The resource was deleted successfully.\n@errors {404: Resource not found}\n\n@endpoint GET /rooms/{room_id}\n@desc View a room.\n@required {room_id: str(uuid) # The unique identifier of a room.}\n@optional {include_sessions: bool # To decide if room sessions should be included in the response.}\n@returns(200) {data: map{id: str(uuid), max_participants: int, unique_name: str, created_at: str(date-time), updated_at: str(date-time), active_session_id: str(uuid), sessions: [map], enable_recording: bool, webhook_event_url: str(uri), webhook_event_failover_url: str(uri), webhook_timeout_secs: int, record_type: str}} # Get room response.\n@errors {404: Resource not found}\n\n@endpoint PATCH /rooms/{room_id}\n@desc Update a room.\n@required {room_id: str(uuid) # The unique identifier of a room.}\n@optional {unique_name: str # The unique (within the Telnyx account scope) name of the room., max_participants: int=10 # The maximum amount of participants allowed in a room. If new participants try to join after that limit is reached, their request will be rejected., enable_recording: bool=false # Enable or disable recording for that room., webhook_event_url: str(uri) # The URL where webhooks related to this room will be sent. Must include a scheme, such as 'https'., webhook_event_failover_url: str(uri)= # The failover URL where webhooks related to this room will be sent if sending to the primary URL fails. Must include a scheme, such as 'https'., webhook_timeout_secs: int=null # Specifies how many seconds to wait before timing out a webhook.}\n@returns(200) {data: map{id: str(uuid), max_participants: int, unique_name: str, created_at: str(date-time), updated_at: str(date-time), active_session_id: str(uuid), sessions: [map], enable_recording: bool, webhook_event_url: str(uri), webhook_event_failover_url: str(uri), webhook_timeout_secs: int, record_type: str}} # Update room response.\n@errors {401: Unauthorized, 404: Resource not found, 422: Bad request}\n\n@endpoint POST /rooms/{room_id}/actions/generate_join_client_token\n@desc Create Client Token to join a room.\n@required {room_id: str(uuid) # The unique identifier of a room.}\n@optional {token_ttl_secs: int=600 # The time to live in seconds of the Client Token, after that time the Client Token is invalid and can't be used to join a Room., refresh_token_ttl_secs: int=3600 # The time to live in seconds of the Refresh Token, after that time the Refresh Token is invalid and can't be used to refresh Client Token.}\n@returns(201) {data: map{token: str, token_expires_at: str(date-time), refresh_token: str, refresh_token_expires_at: str(date-time)}} # Create room client token response.\n@errors {403: Forbidden}\n\n@endpoint POST /rooms/{room_id}/actions/refresh_client_token\n@desc Refresh Client Token to join a room.\n@required {room_id: str(uuid) # The unique identifier of a room., refresh_token: str}\n@optional {token_ttl_secs: int=600 # The time to live in seconds of the Client Token, after that time the Client Token is invalid and can't be used to join a Room.}\n@returns(201) {data: map{token: str, token_expires_at: str(date-time)}} # Refresh room client token response.\n@errors {403: Forbidden}\n\n@endpoint GET /rooms/{room_id}/sessions\n@desc View a list of room sessions.\n@required {room_id: str(uuid) # The unique identifier of a room.}\n@optional {include_participants: bool # To decide if room participants should be included in the response., filter: map # Consolidated filter parameter (deepObject style). Originally: filter[date_created_at][eq], filter[date_created_at][gte], filter[date_created_at][lte], filter[date_updated_at][eq], filter[date_updated_at][gte], filter[date_updated_at][lte], filter[date_ended_at][eq], filter[date_ended_at][gte], filter[date_ended_at][lte], filter[active], page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # List room sessions response.\n@errors {4XX: Unexpected error}\n\n@endgroup\n\n@group session_analysis\n@endpoint GET /session_analysis/metadata\n@desc Get metadata overview\n@returns(200) {record_types: [map], query_parameters: map, meta: map{total_record_types: int, last_updated: str(date-time)}} # Metadata overview\n@errors {401: Unauthorized, 500: Internal server error}\n\n@endpoint GET /session_analysis/metadata/{record_type}\n@desc Get record type metadata\n@required {record_type: str # The record type identifier (e.g. \"call-control\").}\n@returns(200) {record_type: str, aliases: [str], product: str, event: str, child_relationships: [map], parent_relationships: [map], examples: map, meta: map{total_children: int, total_siblings: int, total_parents: int, max_recommended_depth: int}} # Record type metadata\n@errors {404: Record type not found, 500: Internal server error}\n\n@endpoint GET /session_analysis/{record_type}/{event_id}\n@desc Get session analysis\n@required {record_type: str # The record type identifier., event_id: str(uuid) # The event identifier (UUID).}\n@optional {include_children: bool=true # Whether to include child events in the response., max_depth: int=2 # Maximum traversal depth for the event tree., expand: str(record/none)=record # Controls what data to expand on each event node., date_time: str(date-time) # ISO 8601 timestamp or date to narrow index selection for faster lookups. Accepts full datetime (e.g., 2026-03-17T10:00:00Z) or date-only format (e.g., 2026-03-17).}\n@returns(200) {session_id: str, cost: map{total: str, currency: str}, root: map{id: str, product: str, event_name: str, relationship: any, cost: map{event_cost: str, cumulative_cost: str, currency: str}, links: map{self: str, records: str}, record: map, children: [map]}, meta: map{event_count: int, products: [str]}} # Session analysis result\n@errors {400: Invalid request parameters, 403: Forbidden, 404: Event not found, 500: Internal server error}\n\n@endgroup\n\n@group seti\n@endpoint GET /seti/black_box_test_results\n@desc Retrieve Black Box Test Results\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[product]}\n@returns(200) {data: [map]} # A list of black box test results.\n@errors {401: Unauthorized}\n\n@endgroup\n\n@group short_codes\n@endpoint GET /short_codes\n@desc List short codes\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[messaging_profile_id], page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of short codes.\n@errors {4XX: Unexpected error}\n\n@endpoint GET /short_codes/{id}\n@desc Retrieve a short code\n@required {id: str(uuid) # The id of the short code}\n@returns(200) {data: map{record_type: str, id: str(uuid), short_code: str, country_code: str, messaging_profile_id: str?, tags: [str], created_at: str(date-time), updated_at: str(date-time)}} # Successful response with details about a short code.\n@errors {4XX: Unexpected error}\n\n@endpoint PATCH /short_codes/{id}\n@desc Update short code\n@required {id: str(uuid) # The id of the short code, messaging_profile_id: str # Unique identifier for a messaging profile.}\n@optional {tags: [str] # Tags associated with the resource.}\n@returns(200) {data: map{record_type: str, id: str(uuid), short_code: str, country_code: str, messaging_profile_id: str?, tags: [str], created_at: str(date-time), updated_at: str(date-time)}} # Successful response with details about a short code.\n@errors {4XX: Unexpected error}\n\n@endgroup\n\n@group sim_card_actions\n@endpoint GET /sim_card_actions\n@desc List SIM card actions\n@optional {filter: map # Consolidated filter parameter for SIM card actions (deepObject style). Originally: filter[sim_card_id], filter[status], filter[bulk_sim_card_action_id], filter[action_type], page: map # Consolidated pagination parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {401: Unauthorized}\n\n@endpoint GET /sim_card_actions/{id}\n@desc Get SIM card action details\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: map{id: str(uuid), record_type: str, sim_card_id: str(uuid), action_type: str, status: map{value: str, reason: str}, settings: map?, created_at: str, updated_at: str}} # Successful Response\n@errors {401: Unauthorized}\n\n@endgroup\n\n@group sim_card_data_usage_notifications\n@endpoint GET /sim_card_data_usage_notifications\n@desc List SIM card data usage notifications\n@optional {page[number]: int=1: any # The page number to load., page[size]: int=20 # The size of the page., filter[sim_card_id]: str(uuid) # A valid SIM card ID.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {401: Unauthorized}\n\n@endpoint POST /sim_card_data_usage_notifications\n@desc Create a new SIM card data usage notification\n@required {sim_card_id: str(uuid) # The identification UUID of the related SIM card resource., threshold: map{amount: str, unit: str} # Data usage threshold that will trigger the notification.}\n@returns(201) {data: map{id: str(uuid), sim_card_id: str(uuid), record_type: str, threshold: map{amount: str, unit: str}, created_at: str, updated_at: str}} # Successful Response\n@errors {401: Unauthorized}\n\n@endpoint DELETE /sim_card_data_usage_notifications/{id}\n@desc Delete SIM card data usage notifications\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: map{id: str(uuid), sim_card_id: str(uuid), record_type: str, threshold: map{amount: str, unit: str}, created_at: str, updated_at: str}} # Successful Response\n@errors {401: Unauthorized}\n\n@endpoint GET /sim_card_data_usage_notifications/{id}\n@desc Get a single SIM card data usage notification\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: map{id: str(uuid), sim_card_id: str(uuid), record_type: str, threshold: map{amount: str, unit: str}, created_at: str, updated_at: str}} # Successful Response\n@errors {404: Resource not found}\n\n@endpoint PATCH /sim_card_data_usage_notifications/{id}\n@desc Updates information for a SIM Card Data Usage Notification\n@required {id: str(uuid) # Identifies the resource.}\n@optional {id: str(uuid) # Identifies the resource., sim_card_id: str(uuid) # The identification UUID of the related SIM card resource., record_type: str, threshold: map{amount: str, unit: str} # Data usage threshold that will trigger the notification., created_at: str # ISO 8601 formatted date-time indicating when the resource was created., updated_at: str # ISO 8601 formatted date-time indicating when the resource was updated.}\n@returns(200) {data: map{id: str(uuid), sim_card_id: str(uuid), record_type: str, threshold: map{amount: str, unit: str}, created_at: str, updated_at: str}} # Successful Response\n@errors {401: Unauthorized}\n\n@endgroup\n\n@group sim_card_group_actions\n@endpoint GET /sim_card_group_actions\n@desc List SIM card group actions\n@optional {page[number]: int=1: any # The page number to load., page[size]: int=20 # The size of the page., filter[sim_card_group_id]: str(uuid) # A valid SIM card group ID., filter[status]: str(in-progress/completed/failed) # Filter by a specific status of the resource's lifecycle., filter[type]: str(set_private_wireless_gateway/remove_private_wireless_gateway/set_wireless_blocklist/remove_wireless_blocklist) # Filter by action type.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {401: Unauthorized}\n\n@endpoint GET /sim_card_group_actions/{id}\n@desc Get SIM card group action details\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: map{id: str(uuid), record_type: str, sim_card_group_id: str(uuid), type: str, status: str, settings: map{private_wireless_gateway_id: str(uuid), wireless_blocklist_id: str(uuid)}, created_at: str, updated_at: str}} # Successful Response\n@errors {401: Unauthorized}\n\n@endgroup\n\n@group sim_card_groups\n@endpoint GET /sim_card_groups\n@desc Get all SIM card groups\n@optional {page[number]: int=1: any # The page number to load., page[size]: int=20 # The size of the page., filter[name]: str # A valid SIM card group name., filter[private_wireless_gateway_id]: str(uuid) # A Private Wireless Gateway ID associated with the group., filter[wireless_blocklist_id]: str(uuid) # A Wireless Blocklist ID associated with the group.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {401: Unauthorized}\n\n@endpoint POST /sim_card_groups\n@desc Create a SIM card group\n@required {name: str # A user friendly name for the SIM card group.}\n@optional {data_limit: map{amount: str, unit: str} # Upper limit on the amount of data the SIM cards, within the group, can use.}\n@returns(200) {data: map{id: str(uuid), record_type: str, default: bool, name: str, data_limit: map{amount: str, unit: str}, consumed_data: map{unit: str, amount: str}, private_wireless_gateway_id: str(uuid), wireless_blocklist_id: str(uuid), created_at: str, updated_at: str}} # Successful Response\n@errors {401: Unauthorized}\n\n@endpoint DELETE /sim_card_groups/{id}\n@desc Delete a SIM card group\n@required {id: str(uuid) # Identifies the SIM group.}\n@returns(200) {data: map{id: str(uuid), record_type: str, default: bool, name: str, data_limit: map{amount: str, unit: str}, consumed_data: map{unit: str, amount: str}, private_wireless_gateway_id: str(uuid), wireless_blocklist_id: str(uuid), created_at: str, updated_at: str}} # Successful Response\n@errors {401: Unauthorized}\n\n@endpoint GET /sim_card_groups/{id}\n@desc Get SIM card group\n@required {id: str(uuid) # Identifies the SIM group.}\n@optional {include_iccids: bool=false # It includes a list of associated ICCIDs.}\n@returns(200) {data: map{id: str(uuid), record_type: str, default: bool, name: str, data_limit: map{amount: str, unit: str}, consumed_data: map{unit: str, amount: str}, private_wireless_gateway_id: str(uuid), wireless_blocklist_id: str(uuid), created_at: str, updated_at: str}} # Successful Response\n@errors {401: Unauthorized}\n\n@endpoint PATCH /sim_card_groups/{id}\n@desc Update a SIM card group\n@required {id: str(uuid) # Identifies the SIM group.}\n@optional {name: str # A user friendly name for the SIM card group., data_limit: map{amount: str, unit: str} # Upper limit on the amount of data the SIM cards, within the group, can use.}\n@returns(200) {data: map{id: str(uuid), record_type: str, default: bool, name: str, data_limit: map{amount: str, unit: str}, consumed_data: map{unit: str, amount: str}, private_wireless_gateway_id: str(uuid), wireless_blocklist_id: str(uuid), created_at: str, updated_at: str}} # Successful Response\n@errors {401: Unauthorized}\n\n@endpoint POST /sim_card_groups/{id}/actions/remove_private_wireless_gateway\n@desc Request Private Wireless Gateway removal from SIM card group\n@required {id: str(uuid) # Identifies the SIM group.}\n@returns(202) {data: map{id: str(uuid), record_type: str, sim_card_group_id: str(uuid), type: str, status: str, settings: map{private_wireless_gateway_id: str(uuid), wireless_blocklist_id: str(uuid)}, created_at: str, updated_at: str}} # Successful Response\n@errors {401: Unauthorized}\n\n@endpoint POST /sim_card_groups/{id}/actions/remove_wireless_blocklist\n@desc Request Wireless Blocklist removal from SIM card group\n@required {id: str(uuid) # Identifies the SIM group.}\n@returns(202) {data: map{id: str(uuid), record_type: str, sim_card_group_id: str(uuid), type: str, status: str, settings: map{private_wireless_gateway_id: str(uuid), wireless_blocklist_id: str(uuid)}, created_at: str, updated_at: str}} # Successful Response\n@errors {401: Unauthorized, 404: SIM Card Group not found, 422: No Wireless Blocklist is assigned to the SIM Card Group}\n\n@endpoint POST /sim_card_groups/{id}/actions/set_private_wireless_gateway\n@desc Request Private Wireless Gateway assignment for SIM card group\n@required {id: str(uuid) # Identifies the SIM group., private_wireless_gateway_id: str(uuid) # The identification of the related Private Wireless Gateway resource.}\n@returns(202) {data: map{id: str(uuid), record_type: str, sim_card_group_id: str(uuid), type: str, status: str, settings: map{private_wireless_gateway_id: str(uuid), wireless_blocklist_id: str(uuid)}, created_at: str, updated_at: str}} # Successful Response\n@errors {401: Unauthorized}\n\n@endpoint POST /sim_card_groups/{id}/actions/set_wireless_blocklist\n@desc Request Wireless Blocklist assignment for SIM card group\n@required {id: str(uuid) # Identifies the SIM group., wireless_blocklist_id: str(uuid) # The identification of the related Wireless Blocklist resource.}\n@returns(202) {data: map{id: str(uuid), record_type: str, sim_card_group_id: str(uuid), type: str, status: str, settings: map{private_wireless_gateway_id: str(uuid), wireless_blocklist_id: str(uuid)}, created_at: str, updated_at: str}} # Successful Response\n@errors {401: Unauthorized, 404: SIM Card Group not found, 422: Wireless Blocklist not found}\n\n@endgroup\n\n@group sim_card_order_preview\n@endpoint POST /sim_card_order_preview\n@desc Preview SIM card orders\n@required {quantity: int # The amount of SIM cards that the user would like to purchase in the SIM card order., address_id: str # Uniquely identifies the address for the order.}\n@returns(202) {data: map{total_cost: map{amount: str, currency: str}, shipping_cost: map{amount: str, currency: str}, sim_cards_cost: map{amount: str, currency: str}, record_type: str, quantity: int}} # Successful Response\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endgroup\n\n@group sim_card_orders\n@endpoint GET /sim_card_orders\n@desc Get all SIM card orders\n@optional {filter: map # Consolidated filter parameter for SIM card orders (deepObject style). Originally: filter[created_at], filter[updated_at], filter[quantity], filter[cost.amount], filter[cost.currency], filter[address.id], filter[address.street_address], filter[address.extended_address], filter[address.locality], filter[address.administrative_area], filter[address.country_code], filter[address.postal_code], page: map # Consolidated pagination parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {401: Unauthorized}\n\n@endpoint POST /sim_card_orders\n@desc Create a SIM card order\n@required {address_id: str # Uniquely identifies the address for the order., quantity: int # The amount of SIM cards to order.}\n@returns(200) {data: map{id: str(uuid), record_type: str, quantity: int, cost: map{amount: str, currency: str}, order_address: map{id: str, first_name: str, last_name: str, business_name: str, street_address: str, extended_address: str, locality: str, administrative_area: str, country_code: str, postal_code: str}, tracking_url: str(uri), status: str, created_at: str, updated_at: str}} # Successful Response\n@errors {401: Unauthorized}\n\n@endpoint GET /sim_card_orders/{id}\n@desc Get a single SIM card order\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: map{id: str(uuid), record_type: str, quantity: int, cost: map{amount: str, currency: str}, order_address: map{id: str, first_name: str, last_name: str, business_name: str, street_address: str, extended_address: str, locality: str, administrative_area: str, country_code: str, postal_code: str}, tracking_url: str(uri), status: str, created_at: str, updated_at: str}} # Successful Response\n@errors {404: Resource not found}\n\n@endgroup\n\n@group sim_cards\n@endpoint GET /sim_cards\n@desc Get all SIM cards\n@optional {filter: map # Consolidated filter parameter for SIM cards (deepObject style). Originally: filter[iccid], filter[msisdn], filter[status], filter[tags], page: map # Consolidated pagination parameter (deepObject style). Originally: page[number], page[size], include_sim_card_group: bool=false # It includes the associated SIM card group object in the response when present., filter[sim_card_group_id]: str(uuid) # A valid SIM card group ID., sort: str(current_billing_period_consumed_data.amount/-current_billing_period_consumed_data.amount) # Sorts SIM cards by the given field. Defaults to ascending order unless field is prefixed with a minus sign.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {401: Unauthorized}\n\n@endpoint POST /sim_cards/actions/bulk_disable_voice\n@desc Request bulk disabling voice on SIM cards.\n@required {sim_card_group_id: str}\n@returns(202) {data: map{id: str(uuid), record_type: str, action_type: str, settings: map, created_at: str, updated_at: str}} # Bulk action accepted. Poll GET /bulk_sim_card_actions/{id} with the returned bulk action id to track progress.\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint POST /sim_cards/actions/bulk_enable_voice\n@desc Request bulk enabling voice on SIM cards.\n@required {sim_card_group_id: str}\n@optional {connection_id: str # The identifier of the Mobile Voice Connection to associate with the SIM cards. The connection must be owned by the same user and of type mobile_voice. If omitted, voice is enabled without a connection association.}\n@returns(202) {data: map{id: str(uuid), record_type: str, action_type: str, settings: map, created_at: str, updated_at: str}} # Bulk action accepted. Poll GET /bulk_sim_card_actions/{id} with the returned bulk action id to track progress.\n@errors {400: Bad Request — invalid connection_id format, 422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint POST /sim_cards/actions/bulk_set_public_ips\n@desc Request bulk setting SIM card public IPs.\n@required {sim_card_ids: [str(uuid)]}\n@returns(202) {data: map{id: str(uuid), record_type: str, action_type: str, settings: map, created_at: str, updated_at: str}} # Bulk action accepted. Poll GET /bulk_sim_card_actions/{id} with the returned bulk action id to track progress.\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint POST /sim_cards/actions/validate_registration_codes\n@desc Validate SIM cards registration codes\n@optional {registration_codes: [str]}\n@returns(200) {data: [map]} # Successful\n@errors {401: Unauthorized}\n\n@endpoint DELETE /sim_cards/{id}\n@desc Deletes a SIM card\n@required {id: str(uuid) # Identifies the SIM.}\n@optional {report_lost: bool=false # Enables deletion of disabled eSIMs that can't be uninstalled from a device. This is irreversible and the eSIM cannot be re-registered.}\n@returns(200) {data: map{id: str(uuid), record_type: str, status: map{value: str, reason: str}, type: str, iccid: str, imsi: str, msisdn: str, sim_card_group_id: str(uuid), tags: [str], authorized_imeis: [str]?, current_imei: str, data_limit: map{amount: str, unit: str}, current_billing_period_consumed_data: map{amount: str, unit: str}, actions_in_progress: bool, created_at: str, updated_at: str, ipv4: str, ipv6: str, current_device_location: map{latitude: str, longitude: str, accuracy: int, accuracy_unit: str}, current_mnc: str, current_mcc: str, live_data_session: str, pin_puk_codes: map{pin1: str, pin2: str, puk1: str, puk2: str}, esim_installation_status: str?, version: str, resources_with_in_progress_actions: [map], eid: str?, voice_enabled: bool}} # Successful response\n@errors {401: Unauthorized}\n\n@endpoint GET /sim_cards/{id}\n@desc Get SIM card\n@required {id: str(uuid) # Identifies the SIM.}\n@optional {include_sim_card_group: bool=false # It includes the associated SIM card group object in the response when present., include_pin_puk_codes: bool=false # When set to true, includes the PIN and PUK codes in the response. These codes are used for SIM card security and unlocking purposes. Available for both physical SIM cards and eSIMs.}\n@returns(200) {data: map{id: str(uuid), record_type: str, status: map{value: str, reason: str}, type: str, iccid: str, imsi: str, msisdn: str, sim_card_group_id: str(uuid), tags: [str], authorized_imeis: [str]?, current_imei: str, data_limit: map{amount: str, unit: str}, current_billing_period_consumed_data: map{amount: str, unit: str}, actions_in_progress: bool, created_at: str, updated_at: str, ipv4: str, ipv6: str, current_device_location: map{latitude: str, longitude: str, accuracy: int, accuracy_unit: str}, current_mnc: str, current_mcc: str, live_data_session: str, pin_puk_codes: map{pin1: str, pin2: str, puk1: str, puk2: str}, esim_installation_status: str?, version: str, resources_with_in_progress_actions: [map], eid: str?, voice_enabled: bool}} # Successful response\n@errors {401: Unauthorized}\n\n@endpoint PATCH /sim_cards/{id}\n@desc Update a SIM card\n@required {id: str(uuid) # Identifies the SIM.}\n@optional {id: str(uuid) # Identifies the resource., record_type: str, status: map{value: str, reason: str}, type: str(physical/esim) # The type of SIM card, iccid: str # The ICCID is the identifier of the specific SIM card/chip. Each SIM is internationally identified by its integrated circuit card identifier (ICCID). ICCIDs are stored in the SIM card's memory and are also engraved or printed on the SIM card body during a process called personalization., imsi: str # SIM cards are identified on their individual network operators by a unique International Mobile Subscriber Identity (IMSI).  Mobile network operators connect mobile phone calls and communicate with their market SIM cards using their IMSIs. The IMSI is stored in the Subscriber  Identity Module (SIM) inside the device and is sent by the device to the appropriate network. It is used to acquire the details of the device in the Home  Location Register (HLR) or the Visitor Location Register (VLR)., msisdn: str # Mobile Station International Subscriber Directory Number (MSISDN) is a number used to identify a mobile phone number internationally.  MSISDN is defined by the E.164 numbering plan. It includes a country code and a National Destination Code which identifies the subscriber's operator., sim_card_group_id: str(uuid) # The group SIMCardGroup identification. This attribute can be null when it's present in an associated resource., tags: [str] # Searchable tags associated with the SIM card, authorized_imeis: [str] # List of IMEIs authorized to use a given SIM card., current_imei: str # IMEI of the device where a given SIM card is currently being used., data_limit: map{amount: str, unit: str} # The SIM card individual data limit configuration., current_billing_period_consumed_data: map{amount: str, unit: str} # The SIM card consumption so far in the current billing cycle., actions_in_progress: bool=false # Indicate whether the SIM card has any pending (in-progress) actions., created_at: str # ISO 8601 formatted date-time indicating when the resource was created., updated_at: str # ISO 8601 formatted date-time indicating when the resource was updated., ipv4: str # The SIM's address in the currently connected network. This IPv4 address is usually obtained dynamically, so it may vary according to the location or new connections., ipv6: str # The SIM's address in the currently connected network. This IPv6 address is usually obtained dynamically, so it may vary according to the location or new connections., current_device_location: map{latitude: str, longitude: str, accuracy: int, accuracy_unit: str} # Current physical location data of a given SIM card. Accuracy is given in meters., current_mnc: str # Mobile Network Code of the current network to which the SIM card is connected. It's a two to three decimal digits that identify a network.  This code is commonly seen joined with a Mobile Country Code (MCC) in a tuple that allows identifying a carrier known as PLMN (Public Land Mobile Network) code., current_mcc: str # Mobile Country Code of the current network to which the SIM card is connected. It's a three decimal digit that identifies a country. This code is commonly seen joined with a Mobile Network Code (MNC) in a tuple that allows identifying a carrier known as PLMN (Public Land Mobile Network) code., live_data_session: str(connected/disconnected/unknown) # Indicates whether the device is actively connected to a network and able to run data., pin_puk_codes: map{pin1: str, pin2: str, puk1: str, puk2: str} # PIN and PUK codes for the SIM card. Only available when include_pin_puk_codes=true is set in the request., esim_installation_status: str(released/disabled) # The installation status of the eSIM. Only applicable for eSIM cards., version: str # The version of the SIM card., resources_with_in_progress_actions: [map] # List of resources with actions in progress., eid: str # The Embedded Identity Document (eID) for eSIM cards., voice_enabled: bool=false # Indicates whether voice services are enabled for the SIM card.}\n@returns(200) {data: map{id: str(uuid), record_type: str, status: map{value: str, reason: str}, type: str, iccid: str, imsi: str, msisdn: str, sim_card_group_id: str(uuid), tags: [str], authorized_imeis: [str]?, current_imei: str, data_limit: map{amount: str, unit: str}, current_billing_period_consumed_data: map{amount: str, unit: str}, actions_in_progress: bool, created_at: str, updated_at: str, ipv4: str, ipv6: str, current_device_location: map{latitude: str, longitude: str, accuracy: int, accuracy_unit: str}, current_mnc: str, current_mcc: str, live_data_session: str, pin_puk_codes: map{pin1: str, pin2: str, puk1: str, puk2: str}, esim_installation_status: str?, version: str, resources_with_in_progress_actions: [map], eid: str?, voice_enabled: bool}} # Successful response\n@errors {401: Unauthorized}\n\n@endpoint POST /sim_cards/{id}/actions/disable\n@desc Request a SIM card disable\n@required {id: str(uuid) # Identifies the SIM.}\n@returns(202) {data: map{id: str(uuid), record_type: str, sim_card_id: str(uuid), action_type: str, status: map{value: str, reason: str}, settings: map?, created_at: str, updated_at: str}} # Action accepted. The response contains a SIM card action; poll GET /sim_card_actions/{id} with the action id to track progress.\n@errors {401: Unauthorized}\n\n@endpoint POST /sim_cards/{id}/actions/disable_voice\n@desc Request disabling voice on a SIM card\n@required {id: str(uuid) # Identifies the SIM.}\n@returns(202) {data: map{id: str(uuid), record_type: str, sim_card_id: str(uuid), action_type: str, status: map{value: str, reason: str}, settings: map?, created_at: str, updated_at: str}} # Action accepted. The response contains a SIM card action; poll GET /sim_card_actions/{id} with the action id to track progress.\n@errors {422: Unprocessable Entity}\n\n@endpoint POST /sim_cards/{id}/actions/enable\n@desc Request a SIM card enable\n@required {id: str(uuid) # Identifies the SIM.}\n@returns(202) {data: map{id: str(uuid), record_type: str, sim_card_id: str(uuid), action_type: str, status: map{value: str, reason: str}, settings: map?, created_at: str, updated_at: str}} # Action accepted. The response contains a SIM card action; poll GET /sim_card_actions/{id} with the action id to track progress.\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint POST /sim_cards/{id}/actions/enable_voice\n@desc Request enabling voice on a SIM card\n@required {id: str(uuid) # Identifies the SIM.}\n@optional {connection_id: str # The identifier of the Mobile Voice Connection to associate with this SIM card. The connection must be owned by the same user and of type mobile_voice. If omitted, voice is enabled without a connection association.}\n@returns(202) {data: map{id: str(uuid), record_type: str, sim_card_id: str(uuid), action_type: str, status: map{value: str, reason: str}, settings: map?, created_at: str, updated_at: str}} # Action accepted. The response contains a SIM card action; poll GET /sim_card_actions/{id} with the action id to track progress.\n@errors {400: Bad Request — invalid connection_id format, 422: Unprocessable Entity}\n\n@endpoint POST /sim_cards/{id}/actions/remove_public_ip\n@desc Request removing a SIM card public IP\n@required {id: str(uuid) # Identifies the SIM.}\n@returns(202) {data: map{id: str(uuid), record_type: str, sim_card_id: str(uuid), action_type: str, status: map{value: str, reason: str}, settings: map?, created_at: str, updated_at: str}} # Action accepted. The response contains a SIM card action; poll GET /sim_card_actions/{id} with the action id to track progress.\n@errors {401: Unauthorized}\n\n@endpoint POST /sim_cards/{id}/actions/set_public_ip\n@desc Request setting a SIM card public IP\n@required {id: str(uuid) # Identifies the SIM.}\n@optional {region_code: str # The code of the region where the public IP should be assigned. A list of available regions can be found at the regions endpoint}\n@returns(202) {data: map{id: str(uuid), record_type: str, sim_card_id: str(uuid), action_type: str, status: map{value: str, reason: str}, settings: map?, created_at: str, updated_at: str}} # Action accepted. The response contains a SIM card action; poll GET /sim_card_actions/{id} with the action id to track progress.\n@errors {401: Unauthorized}\n\n@endpoint POST /sim_cards/{id}/actions/set_standby\n@desc Request setting a SIM card to standby\n@required {id: str(uuid) # Identifies the SIM.}\n@returns(202) {data: map{id: str(uuid), record_type: str, sim_card_id: str(uuid), action_type: str, status: map{value: str, reason: str}, settings: map?, created_at: str, updated_at: str}} # Action accepted. The response contains a SIM card action; poll GET /sim_card_actions/{id} with the action id to track progress.\n@errors {401: Unauthorized}\n\n@endpoint GET /sim_cards/{id}/activation_code\n@desc Get activation code for an eSIM\n@required {id: str(uuid) # Identifies the SIM.}\n@returns(200) {data: map{record_type: str, activation_code: str}} # Successful response\n@errors {401: Unauthorized}\n\n@endpoint GET /sim_cards/{id}/device_details\n@desc Get SIM card device details\n@required {id: str(uuid) # Identifies the SIM.}\n@returns(200) {data: map{record_type: str, imei: str, model_name: str, brand_name: str, device_type: str, operating_system: str}} # Successful response\n@errors {401: Unauthorized}\n\n@endpoint GET /sim_cards/{id}/public_ip\n@desc Get SIM card public IP definition\n@required {id: str(uuid) # Identifies the SIM.}\n@returns(200) {data: map{record_type: str, region_code: str, sim_card_id: str(uuid), type: str, ip: str, created_at: str, updated_at: str}} # Successful response\n@errors {401: Unauthorized}\n\n@endpoint GET /sim_cards/{id}/wireless_connectivity_logs\n@desc List wireless connectivity logs\n@required {id: str(uuid) # Identifies the SIM.}\n@optional {page[number]: int=1: any # The page number to load., page[size]: int=20 # The size of the page.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {401: Unauthorized}\n\n@endgroup\n\n@group siprec_connectors\n@endpoint POST /siprec_connectors\n@desc Create a SIPREC connector\n@required {host: str # Hostname/IPv4 address of the SIPREC SRS., port: int # Port for the SIPREC SRS., name: str # Name for the SIPREC connector resource.}\n@optional {app_subdomain: str # Subdomain to route the call when using Telnyx SRS (optional for non-Telnyx SRS).}\n@returns(201) {data: map{record_type: str, name: str, host: str, port: int, app_subdomain: str, created_at: str, updated_at: str}} # Return details of the SIPREC connector.\n@errors {422: Unprocessable entity. The request was well-formed but contains semantic errors.}\n\n@endpoint DELETE /siprec_connectors/{connector_name}\n@desc Delete a SIPREC connector\n@required {connector_name: str # Uniquely identifies a SIPREC connector.}\n@returns(204) The SIPREC connector was deleted successfully.\n@errors {404: The requested resource does not exist}\n\n@endpoint GET /siprec_connectors/{connector_name}\n@desc Retrieve a SIPREC connector\n@required {connector_name: str # Uniquely identifies a SIPREC connector.}\n@returns(200) {data: map{record_type: str, name: str, host: str, port: int, app_subdomain: str, created_at: str, updated_at: str}} # Return details of the SIPREC connector.\n@errors {404: The requested resource does not exist}\n\n@endpoint PUT /siprec_connectors/{connector_name}\n@desc Update a SIPREC connector\n@required {connector_name: str # Uniquely identifies a SIPREC connector., host: str # Hostname/IPv4 address of the SIPREC SRS., port: int # Port for the SIPREC SRS., name: str # Name for the SIPREC connector resource.}\n@optional {app_subdomain: str # Subdomain to route the call when using Telnyx SRS (optional for non-Telnyx SRS).}\n@returns(200) {data: map{record_type: str, name: str, host: str, port: int, app_subdomain: str, created_at: str, updated_at: str}} # Return details of the SIPREC connector.\n@errors {404: The requested resource does not exist, 422: Unprocessable entity. The request was well-formed but contains semantic errors.}\n\n@endgroup\n\n@group speech-to-text\n@endpoint GET /speech-to-text/providers\n@desc List supported STT providers\n@optional {service_type: str # Filter to entries that support the given service type. For backward compatibility with the values that briefly shipped before the product-aligned rename, the legacy aliases `file_transcription`, `in_call_transcription`, and `ai_assistant_transcription` are silently accepted and normalized to `file_based`, `in_call`, and `ai_assistant` respectively. The response always emits the canonical (post-rename) values., provider: str(deepgram/speechmatics/assemblyai/xai/soniox/parakeet/humain/reson8/cohere/azure/openai/google/telnyx) # Filter to entries for a specific STT provider. The enum mirrors the providers advertised across the speech-to-text spec (including `google` and `telnyx`, which are accepted as WebSocket transcription engines). A provider that has no models currently registered for any service type will return an empty `data` array rather than an error.}\n@returns(200) {data: [map], meta: map{total: int}} # List of supported STT providers and models.\n@errors {400: Bad request — invalid filter value., 401: Authentication failed — missing or invalid API key., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values and business logic violations.}\n\n@endpoint GET /speech-to-text/transcription\n@desc Speech to text over WebSocket\n@required {transcription_engine: str(Azure/Deepgram/Google/Telnyx/xAI/Speechmatics/Soniox/Parakeet/Humain/Reson8/Cohere) # The transcription engine to use for processing the audio stream., input_format: str(mp3/wav/linear16/linear32) # The format of input audio stream.}\n@optional {sample_rate: int # Audio sample rate in Hz. Required when `input_format` is a raw encoding (`linear16`, `linear32`) — those formats carry no header metadata. Ignored for container formats (`mp3`, `wav`), which self-describe their rate., language: str # The language spoken in the audio stream. For `cohere/ar-stt`, this must be `ar` or `en` — unlike other engines, Cohere does not auto-detect the language, and rejects unsupported values including `auto`; omitting it defaults to `ar`., interim_results: bool # Whether to receive interim transcription results., model: any # The specific model to use within the selected transcription engine., endpointing: int # Silence duration (in milliseconds) that triggers end-of-speech detection. When set, the engine uses this value to determine when a speaker has stopped talking. Supported by `xAI`, `Deepgram`, `Google`, `Speechmatics`, and `Soniox`. `Soniox` accepts values between 500 and 3000. Other engines may not support this parameter., redact: str # Enable redaction of sensitive information (e.g., PCI data, SSN) from transcription results. Supported values depend on the transcription engine., keyterm: str # A key term to boost in the transcription. The engine will be more likely to recognize this term. Can be specified multiple times for multiple terms., keywords: str # Comma-separated list of keywords to boost in the transcription. The engine will prioritize recognition of these words.}\n@returns(200) WebSocket upgrade successful — this response is not returned directly. See 101 for frame documentation.\n@errors {101: WebSocket connection established. Communication proceeds via binary audio frames (client) and JSON transcript frames (server).  **Client → Server:** Binary audio data (mp3, wav, linear16, or linear32, per `input_format`). **Server → Client:** See `TranscriptFrame` and `SttErrorFrame` schemas., 400: Invalid parameters — engine not supported or missing required fields., 401: Authentication failed — missing or invalid Authorization header., 422: Unprocessable entity. The request was well-formed but could not be processed due to semantic errors. This includes validation errors, invalid parameter values and business logic violations.}\n\n@endgroup\n\n@group storage\n@endpoint DELETE /storage/buckets/{bucketName}/ssl_certificate\n@desc Remove SSL Certificate\n@required {bucketName: str # Bucket Name}\n@returns(200) {data: map{id: str, issued_to: map{common_name: str, organization: str, organization_unit: str}, issued_by: map{common_name: str, organization: str, organization_unit: str}, valid_from: str(date-time), valid_to: str(date-time), created_at: str(date-time)}} # SSL Certificate Response\n@errors {401: Unauthorized, 404: Bucket or SSL certificate not found, 422: Unprocessable Entity}\n\n@endpoint GET /storage/buckets/{bucketName}/ssl_certificate\n@desc Get Bucket SSL Certificate\n@required {bucketName: str # The name of the bucket}\n@returns(200) {data: map{id: str, issued_to: map{common_name: str, organization: str, organization_unit: str}, issued_by: map{common_name: str, organization: str, organization_unit: str}, valid_from: str(date-time), valid_to: str(date-time), created_at: str(date-time)}} # SSL Certificate Response\n@errors {401: Unauthorized, 404: Bucket or SSL certificate not found, 422: Unprocessable Entity}\n\n@endpoint PUT /storage/buckets/{bucketName}/ssl_certificate\n@desc Add SSL Certificate\n@required {bucketName: str # The name of the bucket}\n@returns(200) {data: map{id: str, issued_to: map{common_name: str, organization: str, organization_unit: str}, issued_by: map{common_name: str, organization: str, organization_unit: str}, valid_from: str(date-time), valid_to: str(date-time), created_at: str(date-time)}} # SSL Certificate Response\n@errors {401: Unauthorized, 404: Bucket not found, 422: Unprocessable Entity}\n\n@endpoint GET /storage/buckets/{bucketName}/usage/api\n@desc Get API Usage\n@required {bucketName: str # The name of the bucket, filter: map # Consolidated filter parameter (deepObject style). Originally: filter[start_time], filter[end_time]}\n@returns(200) {data: [map]} # Bucket Usage\n@errors {401: Unauthorized, 404: Bucket not found, 422: Unprocessable Entity}\n\n@endpoint GET /storage/buckets/{bucketName}/usage/storage\n@desc Get Bucket Usage\n@required {bucketName: str # The name of the bucket}\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_pages: int, total_results: int}} # Bucket Storage Usage\n@errors {401: Unauthorized, 404: Bucket not found, 422: Unprocessable Entity}\n\n@endpoint POST /storage/buckets/{bucketName}/{objectName}/presigned_url\n@desc Create Presigned Object URL\n@required {bucketName: str # The name of the bucket, objectName: str # The name of the object}\n@optional {ttl: int # The time to live of the token in seconds}\n@returns(200) {content: map{token: str, presigned_url: str, expires_at: str(date-time)}} # Presigned URL Object Response\n@errors {401: Unauthorized, 404: Bucket or object not found, 422: Unprocessable Entity}\n\n@endpoint GET /storage/cloudfs\n@desc List CloudFS filesystems\n@optional {page[limit]: int=20: any # The number of filesystems to return per page. Values above 250 are treated as 250., page[after]: str # Opaque cursor from a previous response's `meta.cursors.after`; returns the page after it. Mutually exclusive with `page[before]`., page[before]: str # Opaque cursor from a previous response's `meta.cursors.before`; returns the page before it. Mutually exclusive with `page[after]`., filter[name]: str # Return only the filesystem whose name matches exactly., filter[status]: str(provisioning/ready/needs_format/deleting/failed) # Return only filesystems with this status. Unrecognized values are ignored., filter[region]: str # Return only filesystems in this region., sort: str(created_at/-created_at/updated_at/-updated_at/name/-name)=-created_at # Sort order for the results: a field name for ascending, or the field name prefixed with `-` for descending.}\n@returns(200) {data: [map], meta: map{cursors: map{after: str, before: str}, next: str, previous: str}} # CloudFS filesystems retrieved successfully\n@errors {401: Unauthorized, 422: Unprocessable entity — invalid `page[limit]`, malformed or conflicting cursor, or unsupported `sort` value, 500: Internal server error}\n\n@endpoint POST /storage/cloudfs\n@desc Create a CloudFS filesystem\n@required {Idempotency-Key: str # Unique key that makes the request idempotent (1-255 characters: letters, numbers, `_`, and `-`). Retrying with the same key within 24 hours replays the original response (marked with an `Idempotent-Replayed: true` header) instead of repeating the action. Reusing a key with a different request returns a `422`; sending a key while the original request is still being processed returns a `409`., name: str # Filesystem name, unique within your organization. Names are trimmed and lowercased; after normalization they may contain lowercase letters, numbers, `.`, `_`, and `-` only., region: str(us-central-1/us-east-1/us-west-1) # Region where the filesystem's storage and metadata are provisioned.}\n@returns(201) {data: map{record_type: str, id: str(uuid), name: str, status: str, meta_url: str, meta_token: str, s3_endpoint: str, s3_bucket: str, region: str, created_at: str(date-time), updated_at: str(date-time)}} # CloudFS filesystem created successfully. This is the only response (besides rotate-meta-token) that includes `meta_token`.\n@errors {400: Bad request — malformed JSON, unknown field, or a missing or invalid `Idempotency-Key` header, 401: Unauthorized, 409: Conflict — a request with this `Idempotency-Key` is still being processed, 422: Unprocessable entity — missing or invalid `name` or `region`, a filesystem with this name already exists for your organization, or the `Idempotency-Key` was already used for a different request, 500: Internal server error}\n\n@endpoint DELETE /storage/cloudfs/{id}\n@desc Delete a CloudFS filesystem\n@required {id: str(uuid) # CloudFS filesystem ID}\n@returns(200) {data: map{record_type: str, id: str(uuid), name: str, status: str, meta_url: str, s3_endpoint: str, s3_bucket: str, region: str, error: str, created_at: str(date-time), updated_at: str(date-time)}} # CloudFS filesystem deleted; the returned filesystem has status `deleted`\n@errors {401: Unauthorized, 404: CloudFS filesystem not found, 409: Conflict — the filesystem is not in a state that allows deletion (for example, still `provisioning`), or its bucket still contains data that must be drained first, 422: Unprocessable entity — `id` is not a valid UUID, 500: Internal server error}\n\n@endpoint GET /storage/cloudfs/{id}\n@desc Get a CloudFS filesystem\n@required {id: str(uuid) # CloudFS filesystem ID}\n@returns(200) {data: map{record_type: str, id: str(uuid), name: str, status: str, meta_url: str, s3_endpoint: str, s3_bucket: str, region: str, error: str, created_at: str(date-time), updated_at: str(date-time)}} # CloudFS filesystem retrieved successfully\n@errors {401: Unauthorized, 404: CloudFS filesystem not found, 422: Unprocessable entity — `id` is not a valid UUID, 500: Internal server error}\n\n@endpoint PATCH /storage/cloudfs/{id}\n@desc Update a CloudFS filesystem\n@required {id: str(uuid) # CloudFS filesystem ID}\n@optional {name: str # New filesystem name, unique within your organization. Names are trimmed and lowercased; after normalization they may contain lowercase letters, numbers, `.`, `_`, and `-` only.}\n@returns(200) {data: map{record_type: str, id: str(uuid), name: str, status: str, meta_url: str, s3_endpoint: str, s3_bucket: str, region: str, error: str, created_at: str(date-time), updated_at: str(date-time)}} # CloudFS filesystem updated successfully\n@errors {400: Bad request — malformed JSON, unknown or immutable field, or missing body, 401: Unauthorized, 404: CloudFS filesystem not found, 422: Unprocessable entity — `id` is not a valid UUID, the new `name` is invalid, or a filesystem with that name already exists, 500: Internal server error}\n\n@endpoint POST /storage/cloudfs/{id}/actions/rotate-meta-token\n@desc Rotate the metadata token\n@required {id: str(uuid) # CloudFS filesystem ID, Idempotency-Key: str # Unique key that makes the request idempotent (1-255 characters: letters, numbers, `_`, and `-`). Retrying with the same key within 24 hours replays the original response (marked with an `Idempotent-Replayed: true` header) instead of repeating the action. Reusing a key with a different request returns a `422`; sending a key while the original request is still being processed returns a `409`.}\n@returns(200) {data: map{record_type: str, id: str(uuid), name: str, status: str, meta_url: str, meta_token: str, s3_endpoint: str, s3_bucket: str, region: str, created_at: str(date-time), updated_at: str(date-time)}} # New metadata token issued; the response includes the new `meta_token` and credential-bearing `meta_url`\n@errors {400: Bad request — missing or invalid `Idempotency-Key` header, 401: Unauthorized, 404: CloudFS filesystem not found, 409: Conflict — the filesystem is not in a state that allows rotation (`status` is neither `ready` nor `needs_format`), or a request with this `Idempotency-Key` is still being processed, 422: Unprocessable entity — `id` is not a valid UUID, or the `Idempotency-Key` was already used for a different request, 500: Internal server error}\n\n@endpoint GET /storage/kvs\n@desc List KV namespaces\n@optional {page[number]: int=1: any # The page number to load., page[size]: int=20 # The size of the page. Values above 250 are treated as 250.}\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_pages: int, total_results: int}} # KV namespaces retrieved successfully\n@errors {401: Unauthorized, 500: Internal server error}\n\n@endpoint POST /storage/kvs\n@desc Create a KV namespace\n@required {name: str # Namespace name. May contain lowercase letters, numbers, and hyphens only.}\n@returns(201) {data: map{record_type: str, id: str(uuid), name: str, status: str, created_at: str(date-time), updated_at: str(date-time)}} # KV namespace created successfully\n@errors {400: Bad request — missing or invalid `name`, 401: Unauthorized, 409: Conflict — a namespace with this name already exists for your organization, 500: Internal server error}\n\n@endpoint DELETE /storage/kvs/{id}\n@desc Delete a KV namespace\n@required {id: str(uuid) # KV namespace ID}\n@returns(200) {data: map{record_type: str, id: str(uuid), name: str, status: str, created_at: str(date-time), updated_at: str(date-time)}} # KV namespace deletion initiated\n@errors {400: Bad request — `id` is not a valid UUID, 401: Unauthorized, 404: KV namespace not found, 409: Conflict — the namespace is already being deleted, 500: Internal server error}\n\n@endpoint GET /storage/kvs/{id}\n@desc Get a KV namespace\n@required {id: str(uuid) # KV namespace ID}\n@returns(200) {data: map{record_type: str, id: str(uuid), name: str, status: str, created_at: str(date-time), updated_at: str(date-time)}} # KV namespace retrieved successfully\n@errors {400: Bad request — `id` is not a valid UUID, 401: Unauthorized, 404: KV namespace not found, 500: Internal server error}\n\n@endpoint GET /storage/kvs/{id}/keys\n@desc List keys\n@required {id: str(uuid) # KV namespace ID}\n@optional {prefix: str # Return only keys that start with this prefix., limit: int=1000 # Maximum number of keys to return. Values above 1000 are treated as 1000., cursor: str # Opaque pagination cursor from a previous response's `meta.cursor`.}\n@returns(200) {record_type: str, data: [map], meta: map{has_more: bool, cursor: str}} # Keys retrieved successfully\n@errors {400: Bad request — `id` is not a valid UUID, or `limit` is not a positive integer, 401: Unauthorized, 404: KV namespace not found, 409: Conflict — the namespace is not ready (`status` is not `provision_ok`), 500: Internal server error}\n\n@endpoint DELETE /storage/kvs/{id}/keys/{key}\n@desc Delete a key\n@required {id: str(uuid) # KV namespace ID, key: str # Key name. Allowed characters: `a-z A-Z 0-9 - _ / = .`; maximum 256 characters; names starting with `_` are reserved for system use. May contain `/`. When calling the HTTP API directly, URL-encode the key so the whole string is treated as one key (for example `user/1` -> `user%2F1`). SDK users should pass the key raw - SDKs URL-encode path parameters automatically.}\n@returns(200) Key deleted (returned even if the key did not exist)\n@errors {400: Bad request — invalid `id` or key name, 401: Unauthorized, 404: KV namespace not found (a missing key is not an error), 409: Conflict — the namespace is not ready (`status` is not `provision_ok`), 500: Internal server error}\n\n@endpoint GET /storage/kvs/{id}/keys/{key}\n@desc Get a key's value\n@required {id: str(uuid) # KV namespace ID, key: str # Key name. Allowed characters: `a-z A-Z 0-9 - _ / = .`; maximum 256 characters; names starting with `_` are reserved for system use. May contain `/`. When calling the HTTP API directly, URL-encode the key so the whole string is treated as one key (for example `user/1` -> `user%2F1`). SDK users should pass the key raw - SDKs URL-encode path parameters automatically.}\n@returns(200) Value retrieved successfully. The `Content-Type` header is the value's stored content type (defaults to `application/octet-stream`).\n@errors {400: Bad request — invalid `id` or key name, 401: Unauthorized, 404: Key or namespace not found, 409: Conflict — the namespace is not ready (`status` is not `provision_ok`), 500: Internal server error}\n\n@endpoint PUT /storage/kvs/{id}/keys/{key}\n@desc Set a key's value\n@required {id: str(uuid) # KV namespace ID, key: str # Key name. Allowed characters: `a-z A-Z 0-9 - _ / = .`; maximum 256 characters; names starting with `_` are reserved for system use. May contain `/`. When calling the HTTP API directly, URL-encode the key so the whole string is treated as one key (for example `user/1` -> `user%2F1`). SDK users should pass the key raw - SDKs URL-encode path parameters automatically.}\n@optional {ttl_secs: int(int64) # Time-to-live in seconds. When set, the key expires and is deleted after this duration. Requires a namespace provisioned with TTL support; namespaces without it return a `409`.}\n@returns(200) Key updated\n@returns(201) Key created\n@errors {400: Bad request — invalid `id`, key name, or request body, 401: Unauthorized, 404: KV namespace not found, 409: Conflict — the namespace is not ready (`status` is not `provision_ok`), or `ttl_secs` was set on a namespace without TTL support, 413: Payload too large — the value exceeds 1 MiB, 422: Unprocessable entity — `ttl_secs` is not a positive integer within range, or the unsupported `ttl` parameter was used, 500: Internal server error}\n\n@endpoint GET /storage/migration_source_coverage\n@desc List Migration Source coverage\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_pages: int, total_results: int}} # List Migrations Source Coverage Response\n@errors {401: Unauthorized, 422: Unprocessable Entity}\n\n@endpoint GET /storage/migration_sources\n@desc List all Migration Sources\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_pages: int, total_results: int}} # List Migration Sources Response\n@errors {401: Unauthorized, 422: Unprocessable Entity}\n\n@endpoint POST /storage/migration_sources\n@desc Create a Migration Source\n@required {provider: str(aws/telnyx) # Cloud provider from which to migrate data. Use 'telnyx' if you want to migrate data from one Telnyx bucket to another., provider_auth: map{access_key: str, secret_access_key: str}, bucket_name: str # Bucket name to migrate the data from.}\n@optional {id: str # Unique identifier for the data migration source., source_region: str # For intra-Telnyx buckets migration, specify the source bucket region in this field.}\n@returns(200) {data: map{id: str, provider: str, source_region: str, provider_auth: map{access_key: str, secret_access_key: str}, bucket_name: str}} # Create Migration Source Response\n@errors {401: Unauthorized, 422: Unprocessable Entity}\n@example_request {\"provider\":\"aws\",\"source_region\":\"string\",\"provider_auth\":{\"access_key\":\"string\",\"secret_access_key\":\"string\"},\"bucket_name\":\"string\"}\n\n@endpoint DELETE /storage/migration_sources/{id}\n@desc Delete a Migration Source\n@required {id: str # Unique identifier for the data migration source.}\n@returns(200) {data: map{id: str, provider: str, source_region: str, provider_auth: map{access_key: str, secret_access_key: str}, bucket_name: str}} # Create Migration Source Response\n@errors {401: Unauthorized, 404: Migration source not found, 422: Unprocessable Entity}\n\n@endpoint GET /storage/migration_sources/{id}\n@desc Get a Migration Source\n@required {id: str # Unique identifier for the data migration source.}\n@returns(200) {data: map{id: str, provider: str, source_region: str, provider_auth: map{access_key: str, secret_access_key: str}, bucket_name: str}} # Create Migration Source Response\n@errors {401: Unauthorized, 404: Migration source not found, 422: Unprocessable Entity}\n\n@endpoint GET /storage/migrations\n@desc List all Migrations\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_pages: int, total_results: int}} # List Migrations Response\n@errors {401: Unauthorized, 422: Unprocessable Entity}\n\n@endpoint POST /storage/migrations\n@desc Create a Migration\n@required {source_id: str # ID of the Migration Source from which to migrate data., target_bucket_name: str # Bucket name to migrate the data into. Will default to the same name as the `source_bucket_name`., target_region: str # Telnyx Cloud Storage region to migrate the data to.}\n@optional {id: str # Unique identifier for the data migration., refresh: bool # If true, will continue to poll the source bucket to ensure new data is continually migrated over., last_copy: str(date-time) # Time when data migration was last copied from the source., status: str(pending/checking/migrating/complete/error/stopped) # Status of the migration., bytes_to_migrate: int # Total amount of data found in source bucket to migrate., bytes_migrated: int # Total amount of data that has been succesfully migrated., speed: int # Current speed of the migration., eta: str(date-time) # Estimated time the migration will complete., created_at: str(date-time) # Time when data migration was created}\n@returns(200) {data: map{id: str, source_id: str, target_bucket_name: str, target_region: str, refresh: bool, last_copy: str(date-time), status: str, bytes_to_migrate: int, bytes_migrated: int, speed: int, eta: str(date-time), created_at: str(date-time)}} # Create Migration Response\n@errors {401: Unauthorized, 422: Unprocessable Entity}\n\n@endpoint GET /storage/migrations/{id}\n@desc Get a Migration\n@required {id: str # Unique identifier for the data migration.}\n@returns(200) {data: map{id: str, source_id: str, target_bucket_name: str, target_region: str, refresh: bool, last_copy: str(date-time), status: str, bytes_to_migrate: int, bytes_migrated: int, speed: int, eta: str(date-time), created_at: str(date-time)}} # Create Migration Response\n@errors {401: Unauthorized, 404: Migration not found, 422: Unprocessable Entity}\n\n@endpoint POST /storage/migrations/{id}/actions/stop\n@desc Stop a Migration\n@required {id: str # Unique identifier for the data migration.}\n@returns(200) {data: map{id: str, source_id: str, target_bucket_name: str, target_region: str, refresh: bool, last_copy: str(date-time), status: str, bytes_to_migrate: int, bytes_migrated: int, speed: int, eta: str(date-time), created_at: str(date-time)}} # Create Migration Response\n@errors {401: Unauthorized, 404: Migration not found, 422: Unprocessable Entity}\n\n@endpoint GET /storage/sqldbs\n@desc List SQL databases\n@optional {page[number]: int=1: any # The page number to load., page[size]: int=20 # The size of the page. Values above 250 are treated as 250., filter[name]: str # Filter by exact name match., filter[status]: str(pending/provision_ok/provision_failed/deleting/delete_failed) # Filter by provisioning status., sort: str(name/-name/status/-status/created_at/-created_at)=-created_at # Sort field; prefix with `-` for descending order.}\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_pages: int, total_results: int}} # SQL databases retrieved successfully\n@errors {401: Unauthorized, 422: Validation error — an unsupported `sort` or `filter` value, 500: Internal server error}\n\n@endpoint POST /storage/sqldbs\n@desc Create a SQL database\n@required {name: str # Database name. Lowercase letters, numbers, and hyphens only; must start and end with a letter or number.}\n@returns(201) {data: map{record_type: str, id: str(uuid), name: str, status: str, created_at: str(date-time), updated_at: str(date-time)}} # SQL database created successfully (status `pending`)\n@errors {400: Bad request — the request body is malformed, 401: Unauthorized, 409: Conflict — a database with this name already exists for your organization, 422: Validation error — `name` is missing or not a valid database name, 500: Internal server error}\n\n@endpoint DELETE /storage/sqldbs/{id}\n@desc Delete a SQL database\n@required {id: str(uuid) # SQL database ID}\n@optional {force: bool=false # Delete the database even when functions still bind it. Their bindings stop resolving.}\n@returns(202) Accepted — deletion runs asynchronously. The body is empty; poll `GET /storage/sqldbs/{id}` until it returns `404`.\n@errors {401: Unauthorized, 404: SQL database not found, 409: Conflict — the database is already being deleted, or is still bound by one or more functions, 422: Validation error — `id` is not a valid identifier, 500: Internal server error, 503: Cannot verify whether the database is still in use; retry, or pass `force=true`}\n\n@endpoint GET /storage/sqldbs/{id}\n@desc Get a SQL database\n@required {id: str(uuid) # SQL database ID}\n@returns(200) {data: map{record_type: str, id: str(uuid), name: str, status: str, created_at: str(date-time), updated_at: str(date-time)}} # SQL database retrieved successfully\n@errors {401: Unauthorized, 404: SQL database not found, 422: Validation error — `id` is not a valid identifier, 500: Internal server error}\n\n@endpoint POST /storage/sqldbs/{id}/actions/query\n@desc Run SQL against a SQL database\n@required {id: str(uuid) # SQL database ID, sql: str # The SQL to run. Use positional `?` placeholders and supply the values in `params` rather than interpolating them into this string.}\n@optional {params: [str] # Positional bind parameters, in placeholder order. Each value is a string, a number, a boolean, or null; booleans are cast to `1`/`0`. The count must match the number of `?` placeholders exactly — a mismatch is rejected with 422 rather than binding null for the ones you left out. (Not enforced for multi-statement scripts or named parameters, where the placeholder count is not the number bound.)}\n@returns(200) {data: map{results: [map], success: bool, count: int, duration: num, meta: map{duration: num, rows_read: int, rows_written: int, last_row_id: int, changes: int}}} # The SQL result\n@errors {400: Bad request — the request body is malformed, 401: Unauthorized, 404: SQL database not found, 409: Conflict — the database is not ready yet. This is transient; retry once it reaches `provision_ok`., 413: The SQL body exceeds the maximum size (8 MiB), 422: Validation error — an invalid `id`, empty `sql`, an unsupported bind parameter, the wrong number of bind parameters for the placeholders in `sql`, or a SQL error raised by the database. Also returned for a script over roughly 4 MiB, whose detail ends in `stream too large`: that transport ceiling is reached before the 8 MiB `413`, so ~4 MiB is the size to plan against, 500: Internal server error}\n\n@endgroup\n\n@group sub_number_orders\n@endpoint GET /sub_number_orders\n@desc List sub number orders\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[status], filter[order_request_id], filter[country_code], filter[phone_number_type], filter[phone_numbers_count], filter[include_phone_numbers]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of sub number orders.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint POST /sub_number_orders/report\n@desc Create a sub number orders report\n@optional {status: str(pending/success/failure) # Filter by order status, country_code: str # Filter by country code, created_at_gt: str(date-time) # Filter for orders created after this date, created_at_lt: str(date-time) # Filter for orders created before this date, order_request_id: str(uuid) # Filter by specific order request ID, customer_reference: str # Filter by customer reference}\n@returns(202) {data: map{id: str(uuid), order_type: str, filters: map{status: str, country_code: str, created_at_gt: str(date-time), created_at_lt: str(date-time), order_request_id: str(uuid), customer_reference: str}, status: str, user_id: str(uuid), created_at: str(date-time), updated_at: str(date-time)}} # Report generation accepted. Poll GET /sub_number_orders/report/{report_id} with the returned report id until the report is ready.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /sub_number_orders/report/{report_id}\n@desc Retrieve a sub number orders report\n@required {report_id: str(uuid) # The unique identifier of the sub number orders report}\n@returns(200) {data: map{id: str(uuid), order_type: str, filters: map{status: str, country_code: str, created_at_gt: str(date-time), created_at_lt: str(date-time), order_request_id: str(uuid), customer_reference: str}, status: str, user_id: str(uuid), created_at: str(date-time), updated_at: str(date-time)}} # Sub number orders report response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /sub_number_orders/report/{report_id}/download\n@desc Download a sub number orders report\n@required {report_id: str(uuid) # The unique identifier of the sub number orders report}\n@returns(200) CSV file download\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint POST /sub_number_orders/{id}/requirement_group\n@desc Update requirement group for a sub number order\n@required {id: str(uuid) # The ID of the sub number order, requirement_group_id: str(uuid) # The ID of the requirement group to associate}\n@returns(200) {data: map{id: str(uuid), order_request_id: str(uuid), country_code: str, phone_number_type: str, phone_numbers_count: int, requirements_met: bool, is_block_sub_number_order: bool, status: str, customer_reference: str, created_at: str(date-time), updated_at: str(date-time), record_type: str, regulatory_requirements: [map], phone_numbers: [map]}} # Sub number order requirement group updated successfully\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n@example_request {\"requirement_group_id\":\"a4b201f9-8646-4e54-a7d2-b2e403eeaf8c\"}\n\n@endpoint GET /sub_number_orders/{sub_number_order_id}\n@desc Retrieve a sub number order\n@required {sub_number_order_id: str # The sub number order ID.}\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[include_phone_numbers]}\n@returns(200) {data: map{id: str(uuid), order_request_id: str(uuid), country_code: str, phone_number_type: str, user_id: str(uuid), regulatory_requirements: [map], record_type: str, phone_numbers_count: int, created_at: str(date-time), updated_at: str(date-time), requirements_met: bool, status: str, customer_reference: str, is_block_sub_number_order: bool, phone_numbers: [map]}} # Successful response with details about a sub number order.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint PATCH /sub_number_orders/{sub_number_order_id}\n@desc Update a sub number order's requirements\n@required {sub_number_order_id: str # The sub number order ID.}\n@optional {regulatory_requirements: [map{requirement_id: str(uuid), field_value: str}]}\n@returns(200) {data: map{id: str(uuid), order_request_id: str(uuid), country_code: str, phone_number_type: str, user_id: str(uuid), regulatory_requirements: [map], record_type: str, phone_numbers_count: int, created_at: str(date-time), updated_at: str(date-time), requirements_met: bool, status: str, customer_reference: str, is_block_sub_number_order: bool, phone_numbers: [map]}} # Successful response with details about a sub number order.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint PATCH /sub_number_orders/{sub_number_order_id}/cancel\n@desc Cancel a sub number order\n@required {sub_number_order_id: str # The ID of the sub number order.}\n@returns(200) {data: map{id: str(uuid), order_request_id: str(uuid), country_code: str, phone_number_type: str, user_id: str(uuid), regulatory_requirements: [map], record_type: str, phone_numbers_count: int, created_at: str(date-time), updated_at: str(date-time), requirements_met: bool, status: str, customer_reference: str, is_block_sub_number_order: bool, phone_numbers: [map]}} # Successful response with details about a sub number order.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group sub_number_orders_report\n@endpoint POST /sub_number_orders_report\n@desc Create a sub number orders report\n@optional {status: str(pending/success/failure) # Filter by order status, country_code: str # Filter by country code, created_at_gt: str(date-time) # Filter for orders created after this date, created_at_lt: str(date-time) # Filter for orders created before this date, order_request_id: str(uuid) # Filter by specific order request ID, customer_reference: str # Filter by customer reference}\n@returns(202) {data: map{id: str(uuid), order_type: str, filters: map{status: str, country_code: str, created_at_gt: str(date-time), created_at_lt: str(date-time), order_request_id: str(uuid), customer_reference: str}, status: str, user_id: str(uuid), created_at: str(date-time), updated_at: str(date-time)}} # Report generation accepted. Poll GET /sub_number_orders_report/{report_id} with the returned report id until the report is ready.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /sub_number_orders_report/{report_id}\n@desc Retrieve a sub number orders report\n@required {report_id: str(uuid) # The unique identifier of the sub number orders report}\n@returns(200) {data: map{id: str(uuid), order_type: str, filters: map{status: str, country_code: str, created_at_gt: str(date-time), created_at_lt: str(date-time), order_request_id: str(uuid), customer_reference: str}, status: str, user_id: str(uuid), created_at: str(date-time), updated_at: str(date-time)}} # Sub number orders report response\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endpoint GET /sub_number_orders_report/{report_id}/download\n@desc Download a sub number orders report\n@required {report_id: str(uuid) # The unique identifier of the sub number orders report}\n@returns(200) CSV file download\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 404: The requested resource doesn't exist., 422: Unprocessable entity. Check the 'detail' field in response for details., 500: Unexpected error}\n\n@endgroup\n\n@group telephony_credentials\n@endpoint GET /telephony_credentials\n@desc List all credentials\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[tag], filter[name], filter[status], filter[resource_id], filter[sip_username]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with multiple credentials\n@errors {400: Bad request, 401: Unauthorized, 404: Resource not found}\n\n@endpoint POST /telephony_credentials\n@desc Create a credential\n@required {connection_id: str # Identifies the Credential Connection this credential is associated with.}\n@optional {name: str, tag: str # Tags a credential. A single tag can hold at maximum 1000 credentials., expires_at: str # ISO-8601 formatted date indicating when the credential will expire.}\n@returns(201) {data: map{id: str, record_type: str, name: str, resource_id: str, expired: bool, sip_username: str, sip_password: str, created_at: str, user_id: str, updated_at: str, expires_at: str}} # Successful response with details about a credential\n@errors {422: Bad request}\n\n@endpoint DELETE /telephony_credentials/{id}\n@desc Delete a credential\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{id: str, record_type: str, name: str, resource_id: str, expired: bool, sip_username: str, sip_password: str, created_at: str, user_id: str, updated_at: str, expires_at: str}} # Successful response with details about a credential\n@errors {401: Unauthorized, 404: Resource not found, 422: Bad request}\n\n@endpoint GET /telephony_credentials/{id}\n@desc Get a credential\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{id: str, record_type: str, name: str, resource_id: str, expired: bool, sip_username: str, sip_password: str, created_at: str, user_id: str, updated_at: str, expires_at: str}} # Successful response with details about a credential\n@errors {400: Bad request, 401: Unauthorized, 404: Resource not found}\n\n@endpoint PATCH /telephony_credentials/{id}\n@desc Update a credential\n@required {id: str # Identifies the resource.}\n@optional {name: str, tag: str # Tags a credential. A single tag can hold at maximum 1000 credentials., connection_id: str # Identifies the Credential Connection this credential is associated with., expires_at: str # ISO-8601 formatted date indicating when the credential will expire.}\n@returns(200) {data: map{id: str, record_type: str, name: str, resource_id: str, expired: bool, sip_username: str, sip_password: str, created_at: str, user_id: str, updated_at: str, expires_at: str}} # Successful response with details about a credential\n@errors {401: Unauthorized, 404: Resource not found, 422: Bad request}\n\n@endpoint POST /telephony_credentials/{id}/token\n@desc Create an Access Token.\n@required {id: str # Identifies the resource.}\n@returns(201) JWT\n@errors {404: Resource not Found}\n\n@endgroup\n\n@group terms_of_service\n@endpoint GET /terms_of_service/agreements\n@desc List the calling user's Terms of Service agreements\n@optional {product_type: str # Optional filter. Omit to list the user's agreements for **every** product (branded_calling and number_reputation); pass a value to return only that product's agreements., page[number]: int=1 # 1-based page number. Out-of-range values return an empty page with correct meta., page[size]: int=20 # Items per page. Maximum 250; values above are clamped to 250.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Paginated list of agreements.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint GET /terms_of_service/agreements/{agreement_id}\n@desc Get a Terms of Service agreement by id\n@required {agreement_id: str(uuid) # Unique identifier of the agreement.}\n@returns(200) {data: map{id: str(uuid), terms_version: str, version: str, product_type: str, agreed_at: str(date-time), created_at: str(date-time)}} # Agreement.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint POST /terms_of_service/branded_calling/agree\n@desc Agree to the Branded Calling Terms of Service\n@returns(201) {data: map{id: str(uuid), terms_version: str, version: str, product_type: str, agreed_at: str(date-time), created_at: str(date-time)}} # Agreement recorded.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint GET /terms_of_service/info\n@desc Get Terms of Service information\n@optional {product_type: str # Optional product filter. Omit to return info for all products.}\n@returns(200) {agreements: [map]} # Terms of Service information.\n@errors {401: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint POST /terms_of_service/number_reputation/agree\n@desc Agree to the Phone Number Reputation Terms of Service\n@returns(201) {data: map{id: str(uuid), terms_version: str, version: str, product_type: str, agreed_at: str(date-time), created_at: str(date-time)}} # Agreement recorded.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endpoint GET /terms_of_service/status\n@desc Get the calling user's Terms of Service status\n@optional {product_type: str # Which product's ToS to check. Defaults to `branded_calling`.}\n@returns(200) {data: map{product_type: str, current_terms_version: str, has_agreed: bool, agreed_version: str?, agreed_at: str(date-time)?, agreement_required: bool}} # Status.\n@errors {4XX: An error occurred. The response carries the standard Telnyx error envelope.}\n\n@endgroup\n\n@group texml\n@endpoint GET /texml/Accounts/{account_sid}/Calls\n@desc Fetch multiple call resources\n@required {account_sid: str # The id of the account the resource belongs to.}\n@optional {Page: int # The number of the page to be displayed, zero-indexed, should be used in conjuction with PageToken., PageSize: int # The number of records to be displayed on a page, PageToken: str # Used to request the next page of results., To: str # Filters calls by the to number., From: str # Filters calls by the from number., Status: str(canceled/completed/failed/busy/no-answer) # Filters calls by status., StartTime: str # Filters calls by their start date. Expected format is YYYY-MM-DD., StartTime>: str # Filters calls by their start date (after). Expected format is YYYY-MM-DD, StartTime<: str # Filters calls by their start date (before). Expected format is YYYY-MM-DD, EndTime: str # Filters calls by their end date. Expected format is YYYY-MM-DD, EndTime>: str # Filters calls by their end date (after). Expected format is YYYY-MM-DD, EndTime<: str # Filters calls by their end date (before). Expected format is YYYY-MM-DD}\n@returns(200) {calls: [map], end: int, first_page_uri: str, next_page_uri: str, page: int, page_size: int, start: int, uri: str} # Multiple call resources.\n@errors {404: Resource not found}\n\n@endpoint POST /texml/Accounts/{account_sid}/Calls\n@desc Initiate an outbound call\n@required {account_sid: str # The id of the account the resource belongs to., ApplicationSid: str # The ID of the TeXML Application., To: str # The phone number of the called party. Phone numbers are formatted with a `+` and country code., From: str # The phone number of the party that initiated the call. Phone numbers are formatted with a `+` and country code.}\n@optional {CallerId: str # To be used as the caller id name (SIP From Display Name) presented to the destination (`To` number). The string should have a maximum of 128 characters, containing only letters, numbers, spaces, and `-_~!.+` special characters. If ommited, the display name will be the same as the number in the `From` field., Url: str # The URL from which Telnyx will retrieve the TeXML call instructions., UrlMethod: str(GET/POST)=POST # HTTP request type used for `Url`. The default value is inherited from TeXML Application setting., FallbackUrl: str # A failover URL for which Telnyx will retrieve the TeXML call instructions if the `Url` is not responding., StatusCallback: str # URL destination for Telnyx to send status callback events to for the call., StatusCallbackMethod: str(GET/POST)=POST # HTTP request type used for `StatusCallback`., StatusCallbackEvent: str=completed # The call events for which Telnyx should send a webhook. Multiple events can be defined when separated by a space., MachineDetection: str(Enable/Disable/DetectMessageEnd)=Disable # Enables Answering Machine Detection., DetectionMode: str(Premium/Regular/PremiumCallScreening)=Regular # Allows you to choose between Regular, Premium, and PremiumCallScreening detections. See https://developers.telnyx.com/docs/voice/programmable-voice/answering-machine-detection, AsyncAmd: bool=false # Select whether to perform answering machine detection in the background. By default execution is blocked until Answering Machine Detection is completed., AsyncAmdStatusCallback: str # URL destination for Telnyx to send AMD callback events to for the call., AsyncAmdStatusCallbackMethod: str(GET/POST)=POST # HTTP request type used for `AsyncAmdStatusCallback`. The default value is inherited from TeXML Application setting., MachineDetectionTimeout: int=30000 # Maximum timeout threshold in milliseconds for overall detection., MachineDetectionPromptEndTimeout: int # Silence duration threshold after a call screening prompt before ending prompt detection, in milliseconds. Used when `DetectionMode` is `PremiumCallScreening`., MachineDetectionSpeechThreshold: int=3500 # Maximum threshold of a human greeting. If greeting longer than this value, considered machine. Ignored when `premium` detection is used., MachineDetectionSpeechEndThreshold: int=800 # Silence duration threshold after a greeting message or voice for it be considered human. Ignored when `premium` detection is used., MachineDetectionSilenceTimeout: int=3500 # If initial silence duration is greater than this value, consider it a machine. Ignored when `premium` detection is used., MachineDetectionBeepProfile: str(both/freq_only)=both # Selects which detectors must validate a beep. `both` requires the amplitude and frequency detectors to agree. `freq_only` uses the frequency detector alone, for beeps whose volume is too unsteady for the default profile. Only used when MachineDetection is enabled., MachineDetectionBeepMinFrequency: int(int32) # Lowest frequency, in Hz, that a tone must reach to be treated as a beep. Raising it above 480 excludes North American ringback (440 + 480 Hz), which can otherwise be reported as a beep when the `freq_only` profile is in use. Only used when MachineDetection is enabled., MachineDetectionBeepMaxFrequency: int(int32) # Highest frequency, in Hz, that a tone can reach and still be treated as a beep. Only used when MachineDetection is enabled., MachineDetectionBeepMinToneDuration: int(int32) # Shortest tone, in milliseconds, that can be treated as a beep. Raising it rejects brief tones such as call-progress blips. Only used when MachineDetection is enabled., MachineDetectionBeepSpectralConfirmation: bool # When enabled, a candidate beep must pass an additional spectral check before it is reported. Only used when MachineDetection is enabled., MachineDetectionBeepSpectralWindow: int(int32) # Length of the spectral confirmation window, in milliseconds. Only used when MachineDetection is enabled., MachineDetectionBeepSpectralMinPurity: num # Minimum spectral purity, from 0 to 1, for a tone to be treated as a beep. Raising it rejects mixed tones such as ringback, which combines two frequencies. Only used when MachineDetection is enabled., MachineDetectionBeepSpectralRejectFaxCng: bool # When enabled, the fax CNG tone is rejected rather than reported as a beep. Only used when MachineDetection is enabled., CancelPlaybackOnMachineDetection: bool=true # Whether to cancel ongoing playback on `machine` detection. Defaults to `true`., CancelPlaybackOnDetectMessageEnd: bool=true # Whether to cancel ongoing playback on `greeting ended` detection. Defaults to `true`., DeepfakeDetection: str # Enables Deepfake Detection on the dialed call. When enabled, audio from the remote party is analyzed to determine whether the voice is AI-generated. Results are delivered asynchronously via a callback., DeepfakeDetectionCallbackUrl: str # URL destination for Telnyx to send deepfake detection callback events to for the call., DeepfakeDetectionCallbackMethod: str(GET/POST)=POST # HTTP request type used for `DeepfakeDetectionCallbackUrl`., PreferredCodecs: str # The list of comma-separated codecs to be offered on a call., Record: bool # Whether to record the entire participant's call leg. Defaults to `false`., RecordingChannels: str(mono/dual) # The number of channels in the final recording. Defaults to `mono`., RecordingStatusCallback: str # The URL the recording callbacks will be sent to., RecordingStatusCallbackMethod: str(GET/POST) # HTTP request type used for `RecordingStatusCallback`. Defaults to `POST`., RecordingStatusCallbackEvent: str # The changes to the recording's state that should generate a call to `RecoridngStatusCallback`. Can be: `in-progress`, `completed` and `absent`. Separate multiple values with a space. Defaults to `completed`., RecordingTimeout: int=0 # The number of seconds that Telnyx will wait for the recording to be stopped if silence is detected. The timer only starts when the speech is detected. Please note that the transcription is used to detect silence and the related charge will be applied. The minimum value is 0. The default value is 0 (infinite), RecordingTrack: str(inbound/outbound/both) # The audio track to record for the call. The default is `both`., SendRecordingUrl: bool=true # Whether to send RecordingUrl in webhooks., SipAuthPassword: str # The password to use for SIP authentication., SipAuthUsername: str # The username to use for SIP authentication., Trim: str(trim-silence/do-not-trim) # Whether to trim any leading and trailing silence from the recording. Defaults to `trim-silence`., CustomHeaders: [map{name!: str, value!: str}] # Custom HTTP headers to be sent with the call. Each header should be an object with 'name' and 'value' properties., SipRegion: str(US/Europe/Canada/Australia/Middle East)=US # Defines the SIP region to be used for the call., MediaEncryption: str(disabled/SRTP/DTLS)=disabled # Defines whether media should be encrypted on the call. When set to `SRTP`, the call will use Secure Real-time Transport Protocol for media encryption. When set to `DTLS`, the call will use DTLS for media encryption. Only supported for SIP destinations., SuperviseCallSid: str # The call control ID of the existing call to supervise. When provided, the created leg will be added to the specified call in supervising mode. Status callbacks and action callbacks will NOT be sent for the supervising leg., SupervisingRole: str(barge/whisper/monitor)=barge # The supervising role for the new leg. Determines the audio behavior: barge (hear both sides), whisper (only hear supervisor), monitor (hear both sides but supervisor muted). Default: barge, Timeout: int=30 # The number of seconds to wait for the called party to answer the call before the call is canceled. The minimum value is 5 and the maximum value is 120. Default is 30 seconds., TimeLimit: int=14400 # The maximum duration of the call in seconds. The minimum value is 30 and the maximum value is 14400 (4 hours). Default is 14400 seconds., Texml: str # TeXML to be used as instructions for the call. If provided, the call will execute these instructions instead of fetching from the Url.}\n@returns(200) {from: str, to: str, status: str} # Successful response upon initiating a TeXML call.\n@errors {422: Unprocessable entity. The request was well-formed but contains semantic errors., 429: Too many requests. The number of dial attempts per second allowed for your account has been exceeded. Reduce the rate of outbound dial attempts and retry.}\n\n@endpoint GET /texml/Accounts/{account_sid}/Calls/{call_sid}\n@desc Fetch a call\n@required {call_sid: str # The CallSid that identifies the call to update., account_sid: str # The id of the account the resource belongs to.}\n@returns(200) {account_sid: str, answered_by: str, caller_name: str, date_created: str, date_updated: str, direction: str, duration: str, end_time: str, from: str, from_formatted: str, price: str, price_unit: str, sid: str, start_time: str, status: str, to: str, to_formatted: str, uri: str} # Call resource.\n@errors {404: Resource not found}\n\n@endpoint POST /texml/Accounts/{account_sid}/Calls/{call_sid}\n@desc Update call\n@required {call_sid: str # The CallSid that identifies the call to update., account_sid: str # The id of the account the resource belongs to.}\n@returns(200) {account_sid: str, answered_by: str, caller_name: str, date_created: str, date_updated: str, direction: str, duration: str, end_time: str, from: str, from_formatted: str, price: str, price_unit: str, sid: str, start_time: str, status: str, to: str, to_formatted: str, uri: str} # Call resource.\n@errors {404: Resource not found, 422: Unprocessable entity. The request was well-formed but contains semantic errors.}\n\n@endpoint GET /texml/Accounts/{account_sid}/Calls/{call_sid}/Recordings.json\n@desc Fetch recordings for a call\n@required {account_sid: str # The id of the account the resource belongs to., call_sid: str # The CallSid that identifies the call to update.}\n@returns(200) {recordings: [map], end: int, first_page_uri: str(uri), previous_page_uri: str(uri), next_page_uri: str, page: int, page_size: int, start: int, uri: str} # Successful Get Call Recordings Response\n@errors {404: Resource not found}\n\n@endpoint POST /texml/Accounts/{account_sid}/Calls/{call_sid}/Recordings.json\n@desc Request recording for a call\n@required {account_sid: str # The id of the account the resource belongs to., call_sid: str # The CallSid that identifies the call to update.}\n@returns(200) {account_sid: str, call_sid: str, conference_sid: str(uuid)?, channels: int, date_created: str(date-time), date_updated: str(date-time), start_time: str(date-time), price: str?, price_unit: str?, duration: str?, sid: str, source: str, error_code: str?, track: str, uri: str} # Successful call recording create response\n@errors {404: Resource not found}\n\n@endpoint POST /texml/Accounts/{account_sid}/Calls/{call_sid}/Recordings/{recording_sid}.json\n@desc Update recording on a call\n@required {account_sid: str # The id of the account the resource belongs to., call_sid: str # The CallSid that identifies the call to update., recording_sid: str(uuid) # Uniquely identifies the recording by id.}\n@returns(200) {account_sid: str, call_sid: str, conference_sid: str(uuid)?, channels: int, date_created: str(date-time), date_updated: str(date-time), start_time: str(date-time), price: str?, price_unit: str?, duration: str?, sid: str, source: str, error_code: str?, track: str, uri: str} # Successful call recording create response\n@errors {404: Resource not found}\n\n@endpoint POST /texml/Accounts/{account_sid}/Calls/{call_sid}/Siprec.json\n@desc Request siprec session for a call\n@required {account_sid: str # The id of the account the resource belongs to., call_sid: str # The CallSid that identifies the call to update.}\n@returns(200) {account_sid: str, call_sid: str, sid: str, date_created: str, date_updated: str, start_time: str, status: str, track: str, uri: str, error_code: str} # Successful SIPREC session create response\n@errors {404: Resource not found}\n\n@endpoint POST /texml/Accounts/{account_sid}/Calls/{call_sid}/Siprec/{siprec_sid}.json\n@desc Updates siprec session for a call\n@required {account_sid: str # The id of the account the resource belongs to., call_sid: str # The CallSid that identifies the call to update., siprec_sid: str # The SiprecSid that uniquely identifies the Sip Recording.}\n@returns(200) {account_sid: str, call_sid: str, sid: str, date_updated: str, status: str, uri: str, error_code: str} # Successful SIPREC session update response\n@errors {404: Resource not found}\n\n@endpoint POST /texml/Accounts/{account_sid}/Calls/{call_sid}/Streams.json\n@desc Start streaming media from a call.\n@required {account_sid: str # The id of the account the resource belongs to., call_sid: str # The CallSid that identifies the call to update.}\n@returns(200) {account_sid: str, call_sid: str, sid: str, name: str, status: str, date_updated: str(date-time), uri: str} # Successful call streaming create response\n@errors {404: Resource not found}\n\n@endpoint POST /texml/Accounts/{account_sid}/Calls/{call_sid}/Streams/{streaming_sid}.json\n@desc Update streaming on a call\n@required {account_sid: str # The id of the account the resource belongs to., call_sid: str # The CallSid that identifies the call to update., streaming_sid: str(uuid) # Uniquely identifies the streaming by id.}\n@returns(200) {account_sid: str, call_sid: str, sid: str, status: str, date_updated: str(date-time), uri: str} # Successful call streaming update response\n@errors {404: Resource not found}\n\n@endpoint GET /texml/Accounts/{account_sid}/Conferences\n@desc List conference resources\n@required {account_sid: str # The id of the account the resource belongs to.}\n@optional {Page: int # The number of the page to be displayed, zero-indexed, should be used in conjuction with PageToken., PageSize: int # The number of records to be displayed on a page, PageToken: str # Used to request the next page of results., FriendlyName: str # Filters conferences by their friendly name., Status: str(init/in-progress/completed) # Filters conferences by status., DateCreated: str # Filters conferences by the creation date. Expected format is YYYY-MM-DD. Also accepts inequality operators, e.g. DateCreated>=2023-05-22., DateUpdated: str # Filters conferences by the time they were last updated. Expected format is YYYY-MM-DD. Also accepts inequality operators, e.g. DateUpdated>=2023-05-22.}\n@returns(200) {conferences: [map], end: int, first_page_uri: str, next_page_uri: str, page: int, page_size: int, start: int, uri: str} # Multiple conference resources.\n@errors {404: Resource not found}\n\n@endpoint GET /texml/Accounts/{account_sid}/Conferences/{conference_sid}\n@desc Fetch a conference resource\n@required {account_sid: str # The id of the account the resource belongs to., conference_sid: str # The ConferenceSid that uniquely identifies a conference.}\n@returns(200) {account_sid: str, api_version: str, call_sid_ending_conference: str, date_created: str, date_updated: str, friendly_name: str, reason_conference_ended: str, region: str, sid: str, status: str, subresource_uris: map, uri: str} # Conference resource.\n@errors {404: Resource not found}\n\n@endpoint POST /texml/Accounts/{account_sid}/Conferences/{conference_sid}\n@desc Update a conference resource\n@required {account_sid: str # The id of the account the resource belongs to., conference_sid: str # The ConferenceSid that uniquely identifies a conference.}\n@returns(200) {account_sid: str, api_version: str, call_sid_ending_conference: str, date_created: str, date_updated: str, friendly_name: str, reason_conference_ended: str, region: str, sid: str, status: str, subresource_uris: map, uri: str} # Conference resource.\n@errors {404: Resource not found}\n\n@endpoint GET /texml/Accounts/{account_sid}/Conferences/{conference_sid}/Participants\n@desc List conference participants\n@required {account_sid: str # The id of the account the resource belongs to., conference_sid: str # The ConferenceSid that uniquely identifies a conference.}\n@returns(200) {participants: [map], end: int, first_page_uri: str, next_page_uri: str, page: int, page_size: int, start: int, uri: str} # Multiple participant resources.\n@errors {404: Resource not found}\n\n@endpoint POST /texml/Accounts/{account_sid}/Conferences/{conference_sid}/Participants\n@desc Dial a new conference participant\n@required {account_sid: str # The id of the account the resource belongs to., conference_sid: str # The ConferenceSid that uniquely identifies a conference.}\n@returns(200) {account_sid: str, call_sid: str, coaching: bool, coaching_call_sid: str, end_conference_on_exit: bool, hold: bool, muted: bool, status: str, uri: str, conference_sid: str(uuid)} # New participant resource.\n@errors {404: Resource not found}\n\n@endpoint DELETE /texml/Accounts/{account_sid}/Conferences/{conference_sid}/Participants/{call_sid_or_participant_label}\n@desc Delete a conference participant\n@required {account_sid: str # The id of the account the resource belongs to., conference_sid: str # The ConferenceSid that uniquely identifies a conference., call_sid_or_participant_label: str # CallSid or Label of the Participant to update.}\n@returns(204) The resource was deleted successfully.\n@errors {404: Resource not found}\n\n@endpoint GET /texml/Accounts/{account_sid}/Conferences/{conference_sid}/Participants/{call_sid_or_participant_label}\n@desc Get conference participant resource\n@required {account_sid: str # The id of the account the resource belongs to., conference_sid: str # The ConferenceSid that uniquely identifies a conference., call_sid_or_participant_label: str # CallSid or Label of the Participant to update.}\n@returns(200) {account_sid: str, api_version: str, call_sid: str, call_sid_legacy: str, coaching: bool, coaching_call_sid: str, coaching_call_sid_legacy: str, date_created: str, date_updated: str, end_conference_on_exit: bool, hold: bool, muted: bool, status: str, uri: str, conference_sid: str(uuid)} # Participant resource.\n@errors {404: Resource not found}\n\n@endpoint POST /texml/Accounts/{account_sid}/Conferences/{conference_sid}/Participants/{call_sid_or_participant_label}\n@desc Update a conference participant\n@required {account_sid: str # The id of the account the resource belongs to., conference_sid: str # The ConferenceSid that uniquely identifies a conference., call_sid_or_participant_label: str # CallSid or Label of the Participant to update.}\n@returns(200) {account_sid: str, api_version: str, call_sid: str, call_sid_legacy: str, coaching: bool, coaching_call_sid: str, coaching_call_sid_legacy: str, date_created: str, date_updated: str, end_conference_on_exit: bool, hold: bool, muted: bool, status: str, uri: str, conference_sid: str(uuid)} # Participant resource.\n@errors {404: Resource not found}\n\n@endpoint GET /texml/Accounts/{account_sid}/Conferences/{conference_sid}/Recordings\n@desc List conference recordings\n@required {account_sid: str # The id of the account the resource belongs to., conference_sid: str # The ConferenceSid that uniquely identifies a conference.}\n@returns(200) {recordings: [map], end: int, first_page_uri: str, next_page_uri: str, page: int, page_size: int, start: int, uri: str, participants: [map]} # Multiple conference recording resources.\n@errors {404: Resource not found}\n\n@endpoint GET /texml/Accounts/{account_sid}/Conferences/{conference_sid}/Recordings.json\n@desc Fetch recordings for a conference\n@required {account_sid: str # The id of the account the resource belongs to., conference_sid: str # The ConferenceSid that uniquely identifies a conference.}\n@returns(200) {recordings: [map], end: int, first_page_uri: str(uri), previous_page_uri: str(uri), next_page_uri: str, page: int, page_size: int, start: int, uri: str} # Successful Get Call Recordings Response\n@errors {404: Resource not found}\n\n@endpoint GET /texml/Accounts/{account_sid}/Queues\n@desc List queue resources\n@required {account_sid: str # The id of the account the resource belongs to.}\n@optional {Page: int # The number of the page to be displayed, zero-indexed, should be used in conjuction with PageToken., PageSize: int # The number of records to be displayed on a page, PageToken: str # Used to request the next page of results., DateCreated: str # Filters conferences by the creation date. Expected format is YYYY-MM-DD. Also accepts inequality operators, e.g. DateCreated>=2023-05-22., DateUpdated: str # Filters conferences by the time they were last updated. Expected format is YYYY-MM-DD. Also accepts inequality operators, e.g. DateUpdated>=2023-05-22.}\n@returns(200) {queues: [map], end: int, first_page_uri: str, next_page_uri: str, page: int, page_size: int, start: int, uri: str} # Multiple queue resources.\n@errors {404: Resource not found}\n\n@endpoint POST /texml/Accounts/{account_sid}/Queues\n@desc Create a new queue\n@required {account_sid: str # The id of the account the resource belongs to.}\n@returns(200) {account_sid: str, average_wait_time: int, current_size: int, date_created: str, date_updated: str, max_size: int, sid: str, uri: str, subresource_uris: map} # Queue resource.\n@errors {404: Resource not found}\n\n@endpoint DELETE /texml/Accounts/{account_sid}/Queues/{queue_sid}\n@desc Delete a queue resource\n@required {account_sid: str # The id of the account the resource belongs to., queue_sid: str # The QueueSid that identifies the call queue.}\n@returns(204) The resource was deleted successfully.\n@errors {404: Resource not found}\n\n@endpoint GET /texml/Accounts/{account_sid}/Queues/{queue_sid}\n@desc Fetch a queue resource\n@required {account_sid: str # The id of the account the resource belongs to., queue_sid: str # The QueueSid that identifies the call queue.}\n@returns(200) {account_sid: str, average_wait_time: int, current_size: int, date_created: str, date_updated: str, max_size: int, sid: str, uri: str, subresource_uris: map} # Queue resource.\n@errors {404: Resource not found}\n\n@endpoint POST /texml/Accounts/{account_sid}/Queues/{queue_sid}\n@desc Update a queue resource\n@required {account_sid: str # The id of the account the resource belongs to., queue_sid: str # The QueueSid that identifies the call queue.}\n@returns(200) {account_sid: str, average_wait_time: int, current_size: int, date_created: str, date_updated: str, max_size: int, sid: str, uri: str, subresource_uris: map} # Queue resource.\n@errors {404: Resource not found}\n\n@endpoint GET /texml/Accounts/{account_sid}/Recordings.json\n@desc Fetch multiple recording resources\n@required {account_sid: str # The id of the account the resource belongs to.}\n@optional {Page: int # The number of the page to be displayed, zero-indexed, should be used in conjuction with PageToken., PageSize: int # The number of records to be displayed on a page, DateCreated: str(date-time) # Filters recording by the creation date. Expected format is ISO8601 date or date-time, ie. {YYYY}-{MM}-{DD} or {YYYY}-{MM}-{DD}T{hh}:{mm}:{ss}Z. Also accepts inequality operators, e.g. DateCreated>=2023-05-22.}\n@returns(200) {recordings: [map], end: int, first_page_uri: str(uri), previous_page_uri: str(uri), next_page_uri: str, page: int, page_size: int, start: int, uri: str} # Successful Get Call Recordings Response\n@errors {404: Resource not found}\n\n@endpoint DELETE /texml/Accounts/{account_sid}/Recordings/{recording_sid}.json\n@desc Delete recording resource\n@required {account_sid: str # The id of the account the resource belongs to., recording_sid: str(uuid) # Uniquely identifies the recording by id.}\n@returns(204) The resource was deleted successfully.\n@errors {404: Resource not found}\n\n@endpoint GET /texml/Accounts/{account_sid}/Recordings/{recording_sid}.json\n@desc Fetch recording resource\n@required {account_sid: str # The id of the account the resource belongs to., recording_sid: str(uuid) # Uniquely identifies the recording by id.}\n@returns(200) {account_sid: str, call_sid: str, conference_sid: str(uuid)?, channels: int, date_created: str(date-time), date_updated: str(date-time), start_time: str(date-time), duration: str?, sid: str, source: str, status: str, error_code: str?, subresources_uris: map{transcriptions: str(uri)?}, uri: str, media_url: str(uri)} # Retrieves call recording resource.\n@errors {404: Resource not found}\n\n@endpoint GET /texml/Accounts/{account_sid}/Transcriptions.json\n@desc List recording transcriptions\n@required {account_sid: str # The id of the account the resource belongs to.}\n@optional {PageToken: str # Used to request the next page of results., PageSize: int # The number of records to be displayed on a page}\n@returns(200) {transcriptions: [map], end: int, first_page_uri: str(uri), previous_page_uri: str(uri), next_page_uri: str, page: int, page_size: int, start: int, uri: str} # Successful list Recording Transcriptions Response\n@errors {404: Resource not found}\n\n@endpoint DELETE /texml/Accounts/{account_sid}/Transcriptions/{recording_transcription_sid}.json\n@desc Delete a recording transcription\n@required {account_sid: str # The id of the account the resource belongs to., recording_transcription_sid: str(uuid) # Uniquely identifies the recording transcription by id.}\n@returns(204) The resource was deleted successfully.\n@errors {404: Resource not found}\n\n@endpoint GET /texml/Accounts/{account_sid}/Transcriptions/{recording_transcription_sid}.json\n@desc Fetch a recording transcription resource\n@required {account_sid: str # The id of the account the resource belongs to., recording_transcription_sid: str(uuid) # Uniquely identifies the recording transcription by id.}\n@returns(200) {account_sid: str, call_sid: str, api_version: str, date_created: str(date-time), date_updated: str(date-time), duration: str?, sid: str, recording_sid: str, status: str, transcription_text: str, uri: str} # Successful get Recording Transcription Response\n@errors {404: Resource not found}\n\n@endpoint POST /texml/ai_calls/{connection_id}\n@desc Initiate an outbound AI call\n@required {connection_id: str # The ID of the TeXML connection to use for the call., From: str # The phone number of the party initiating the call. Phone numbers are formatted with a `+` and country code., To: str # The phone number of the called party. Phone numbers are formatted with a `+` and country code., AIAssistantId: str # The ID of the AI assistant to use for the call.}\n@optional {AIAssistantVersion: str # The version of the AI assistant to use., AIAssistantDynamicVariables: map # Key-value map of dynamic variables to pass to the AI assistant., CallerId: str # To be used as the caller id name (SIP From Display Name) presented to the destination (`To` number). The string should have a maximum of 128 characters, containing only letters, numbers, spaces, and `-_~!.+` special characters. If omitted, the display name will be the same as the number in the `From` field., StatusCallback: str # URL destination for Telnyx to send status callback events for this AI call. When provided, this per-call value overrides the status callback URL configured on the TeXML application/connection., StatusCallbackEvent: str=completed # The status callback events for which Telnyx should send a webhook for this AI call. Multiple events can be defined when separated by a space. Valid values: initiated, ringing, answered, completed, no-answer, busy, canceled, failed, analyzed. When provided, this per-call value overrides the status callback events configured on the TeXML application/connection., StatusCallbackMethod: str(GET/POST)=POST # HTTP request type used for `StatusCallback` and `StatusCallbacks` for this AI call. When provided, this per-call value overrides the status callback method configured on the TeXML application/connection., StatusCallbacks: [str] # Array of URL destinations for Telnyx to send status callback events for this AI call. When provided, these per-call values override the status callback URL configured on the TeXML application/connection., CustomHeaders: [map{name!: str, value!: str}] # Custom HTTP headers to be sent with the call. Each header should be an object with 'name' and 'value' properties., ConversationCallback: str # URL destination for Telnyx to send AI conversation callback events for this call. Events include `conversation_created` and `conversation_ended`., ConversationCallbackMethod: str(GET/POST)=POST # HTTP request type used for `ConversationCallback` and `ConversationCallbacks`., ConversationCallbacks: [str] # Array of URL destinations for AI conversation callback events for this call. Events include `conversation_created` and `conversation_ended`., MachineDetection: str(Enable/Disable/DetectMessageEnd)=Disable # Enables Answering Machine Detection., DetectionMode: str(Premium/Regular/PremiumCallScreening)=Regular # Allows you to choose between Regular, Premium, and PremiumCallScreening detections. See https://developers.telnyx.com/docs/voice/programmable-voice/answering-machine-detection, AsyncAmd: bool=false # Select whether to perform answering machine detection in the background. By default execution is blocked until Answering Machine Detection is completed., AsyncAmdStatusCallback: str # URL destination for Telnyx to send AMD callback events to for the call., AsyncAmdStatusCallbackMethod: str(GET/POST)=POST # HTTP request type used for `AsyncAmdStatusCallback`., MachineDetectionTimeout: int=30000 # Maximum timeout threshold in milliseconds for overall detection., MachineDetectionPromptEndTimeout: int # Silence duration threshold after a call screening prompt before ending prompt detection, in milliseconds. Used when `DetectionMode` is `PremiumCallScreening`., MachineDetectionSpeechThreshold: int=3500 # Maximum threshold of a human greeting. If greeting longer than this value, considered machine. Ignored when `premium` detection is used., MachineDetectionSpeechEndThreshold: int=800 # Silence duration threshold after a greeting message or voice for it be considered human. Ignored when `premium` detection is used., MachineDetectionSilenceTimeout: int=3500 # If initial silence duration is greater than this value, consider it a machine. Ignored when `premium` detection is used., MachineDetectionBeepProfile: str(both/freq_only)=both # Selects which detectors must validate a beep. `both` requires the amplitude and frequency detectors to agree. `freq_only` uses the frequency detector alone, for beeps whose volume is too unsteady for the default profile. Only used when MachineDetection is enabled., MachineDetectionBeepMinFrequency: int(int32) # Lowest frequency, in Hz, that a tone must reach to be treated as a beep. Raising it above 480 excludes North American ringback (440 + 480 Hz), which can otherwise be reported as a beep when the `freq_only` profile is in use. Only used when MachineDetection is enabled., MachineDetectionBeepMaxFrequency: int(int32) # Highest frequency, in Hz, that a tone can reach and still be treated as a beep. Only used when MachineDetection is enabled., MachineDetectionBeepMinToneDuration: int(int32) # Shortest tone, in milliseconds, that can be treated as a beep. Raising it rejects brief tones such as call-progress blips. Only used when MachineDetection is enabled., MachineDetectionBeepSpectralConfirmation: bool # When enabled, a candidate beep must pass an additional spectral check before it is reported. Only used when MachineDetection is enabled., MachineDetectionBeepSpectralWindow: int(int32) # Length of the spectral confirmation window, in milliseconds. Only used when MachineDetection is enabled., MachineDetectionBeepSpectralMinPurity: num # Minimum spectral purity, from 0 to 1, for a tone to be treated as a beep. Raising it rejects mixed tones such as ringback, which combines two frequencies. Only used when MachineDetection is enabled., MachineDetectionBeepSpectralRejectFaxCng: bool # When enabled, the fax CNG tone is rejected rather than reported as a beep. Only used when MachineDetection is enabled., Passports: str # A string of passport identifiers to associate with the call., TimeLimit: int=14400 # The maximum duration of the call in seconds. The minimum value is 30 and the maximum value is 14400 (4 hours). Default is 14400 seconds., Timeout: int=30 # The number of seconds to wait for the called party to answer the call before the call is canceled. The minimum value is 5 and the maximum value is 120. Default is 30 seconds., Record: bool # Whether to record the entire participant's call leg. Defaults to `false`., RecordingChannels: str(mono/dual) # The number of channels in the final recording. Defaults to `mono`., RecordingStatusCallback: str # The URL the recording callbacks will be sent to., RecordingStatusCallbackMethod: str(GET/POST) # HTTP request type used for `RecordingStatusCallback`. Defaults to `POST`., RecordingStatusCallbackEvent: str # The changes to the recording's state that should generate a call to `RecordingStatusCallback`. Can be: `in-progress`, `completed` and `absent`. Separate multiple values with a space. Defaults to `completed`., RecordingTimeout: int=0 # The number of seconds that Telnyx will wait for the recording to be stopped if silence is detected. The timer only starts when the speech is detected. The minimum value is 0. The default value is 0 (infinite)., RecordingTrack: str(inbound/outbound/both) # The audio track to record for the call. The default is `both`., Trim: str(trim-silence/do-not-trim) # Whether to trim any leading and trailing silence from the recording. Defaults to `trim-silence`., SendRecordingUrl: bool=true # Whether to send RecordingUrl in webhooks., PreferredCodecs: str # The list of comma-separated codecs to be offered on a call., SipAuthUsername: str # The username to use for SIP authentication., SipAuthPassword: str # The password to use for SIP authentication., SipRegion: str(US/Europe/Canada/Australia/Middle East)=US # Defines the SIP region to be used for the call.}\n@returns(200) {from: str, to: str, status: str, call_sid: str} # Successful response upon initiating an AI call.\n@errors {401: Unauthorized, 422: Unprocessable entity. The request was well-formed but contains semantic errors.}\n\n@endpoint POST /texml/calls/{connection_id}\n@desc Create a connection-scoped TeXML call\n@required {connection_id: str # The ID of the connection holding the TeXML application to call from., From: str # The E.164-formatted phone number or SIP URI to present as the caller., To: str # The E.164-formatted phone number or SIP URI to call.}\n@optional {Texml: str # Inline TeXML instructions to execute when the call is answered., Url: str # The URL from which to retrieve TeXML instructions. Overrides the TeXML application XML request URL., Method: str(GET/POST) # HTTP method used to retrieve TeXML instructions from Url.}\n@returns(200) {call_sid: str, from: str, to: str, status: str} # The outbound call was queued.\n@errors {401: Unauthorized, 422: A required call parameter is missing or invalid.}\n@example_request {\"From\":\"+13120001234\",\"To\":\"+13121230000\",\"Texml\":\"<Response><Say>Hello</Say></Response>\"}\n\n@endpoint POST /texml/secrets\n@desc Create a TeXML secret\n@required {name: str # Name used as a reference for the secret, if the name already exists within the account its value will be replaced, value: str # Secret value which will be used when rendering the TeXML template}\n@returns(201) {data: map{name: str, value: str}} # Successful response upon creating a TeXML secret.\n@errors {422: Unprocessable entity. The request was well-formed but contains semantic errors.}\n\n@endgroup\n\n@group texml_applications\n@endpoint GET /texml_applications\n@desc List all TeXML Applications\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[outbound_voice_profile_id], filter[friendly_name], sort: str(created_at/friendly_name/active)=created_at # Specifies the sort order for results. By default sorting direction is ascending. To have the results sorted in descending order add the  - prefix. That is:         friendly_name: sorts the result by the     friendly_name field in ascending order.            -friendly_name: sorts the result by the     friendly_name field in descending order.      If not given, results are sorted by created_at in descending order.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {400: Bad request. The request could not be understood or was missing required parameters., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action.}\n\n@endpoint POST /texml_applications\n@desc Creates a TeXML Application\n@required {friendly_name: str # A user-assigned name to help manage the application., voice_url: str(uri) # URL to which Telnyx will deliver your XML Translator webhooks.}\n@optional {active: bool=true # Specifies whether the connection can be used., anchorsite_override: str(Latency/Chicago, IL/Ashburn, VA/San Jose, CA/Sydney, Australia/Amsterdam, Netherlands/London, UK/Toronto, Canada/Vancouver, Canada/Frankfurt, Germany)=Latency # `Latency` directs Telnyx to route media through the site with the lowest round-trip time to the user's connection. Telnyx calculates this time using ICMP ping messages. This can be disabled by specifying a site to handle all media., dtmf_type: str(RFC 2833/Inband/SIP INFO)=RFC 2833 # Sets the type of DTMF digits sent from Telnyx to this Connection. Note that DTMF digits sent to Telnyx will be accepted in all formats., first_command_timeout: bool=false # Specifies whether calls to phone numbers associated with this connection should hangup after timing out., first_command_timeout_secs: int=30 # Specifies how many seconds to wait before timing out a dial command., tags: [str] # Tags associated with the Texml Application., voice_fallback_url: str(uri)=null # URL to which Telnyx will deliver your XML Translator webhooks if we get an error response from your voice_url., call_cost_in_webhooks: bool=false # Specifies if call cost webhooks should be sent for this TeXML Application., voice_method: str(get/post)=post # HTTP request method Telnyx will use to interact with your XML Translator webhooks. Either 'get' or 'post'., status_callback: str(uri)=null # URL for Telnyx to send requests to containing information about call progress events., status_callback_method: str(get/post)=post # HTTP request method Telnyx should use when requesting the status_callback URL., inbound: map{channel_limit: int, shaken_stir_enabled: bool, sip_subdomain: str, sip_subdomain_receive_settings: str}, outbound: map{channel_limit: int, outbound_voice_profile_id: str}}\n@returns(201) {data: map{id: str, record_type: str, friendly_name: str, active: bool, anchorsite_override: str, dtmf_type: str, first_command_timeout: bool, first_command_timeout_secs: int, voice_url: str(uri), voice_fallback_url: str(uri), call_cost_in_webhooks: bool, voice_method: str, status_callback: str(uri), status_callback_method: str, tags: [str], inbound: map{channel_limit: int, shaken_stir_enabled: bool, sip_subdomain: str, sip_subdomain_receive_settings: str}, outbound: map{channel_limit: int, outbound_voice_profile_id: str}, created_at: str, updated_at: str}} # Successful response\n@errors {401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: Resource not found, 422: Unprocessable entity. The request was well-formed but contains semantic errors.}\n\n@endpoint DELETE /texml_applications/{id}\n@desc Deletes a TeXML Application\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{id: str, record_type: str, friendly_name: str, active: bool, anchorsite_override: str, dtmf_type: str, first_command_timeout: bool, first_command_timeout_secs: int, voice_url: str(uri), voice_fallback_url: str(uri), call_cost_in_webhooks: bool, voice_method: str, status_callback: str(uri), status_callback_method: str, tags: [str], inbound: map{channel_limit: int, shaken_stir_enabled: bool, sip_subdomain: str, sip_subdomain_receive_settings: str}, outbound: map{channel_limit: int, outbound_voice_profile_id: str}, created_at: str, updated_at: str}} # Successful response\n@errors {400: Bad request. The request could not be understood or was missing required parameters., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist.}\n\n@endpoint GET /texml_applications/{id}\n@desc Retrieve a TeXML Application\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{id: str, record_type: str, friendly_name: str, active: bool, anchorsite_override: str, dtmf_type: str, first_command_timeout: bool, first_command_timeout_secs: int, voice_url: str(uri), voice_fallback_url: str(uri), call_cost_in_webhooks: bool, voice_method: str, status_callback: str(uri), status_callback_method: str, tags: [str], inbound: map{channel_limit: int, shaken_stir_enabled: bool, sip_subdomain: str, sip_subdomain_receive_settings: str}, outbound: map{channel_limit: int, outbound_voice_profile_id: str}, created_at: str, updated_at: str}} # Successful response\n@errors {400: Bad request. The request could not be understood or was missing required parameters., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist.}\n\n@endpoint PATCH /texml_applications/{id}\n@desc Update a TeXML Application\n@required {id: str # Identifies the resource., friendly_name: str # A user-assigned name to help manage the application., voice_url: str(uri) # URL to which Telnyx will deliver your XML Translator webhooks.}\n@optional {active: bool=true # Specifies whether the connection can be used., anchorsite_override: str(Latency/Chicago, IL/Ashburn, VA/San Jose, CA/Sydney, Australia/Amsterdam, Netherlands/London, UK/Toronto, Canada/Vancouver, Canada/Frankfurt, Germany)=Latency # `Latency` directs Telnyx to route media through the site with the lowest round-trip time to the user's connection. Telnyx calculates this time using ICMP ping messages. This can be disabled by specifying a site to handle all media., dtmf_type: str(RFC 2833/Inband/SIP INFO)=RFC 2833 # Sets the type of DTMF digits sent from Telnyx to this Connection. Note that DTMF digits sent to Telnyx will be accepted in all formats., first_command_timeout: bool=false # Specifies whether calls to phone numbers associated with this connection should hangup after timing out., first_command_timeout_secs: int=30 # Specifies how many seconds to wait before timing out a dial command., voice_fallback_url: str(uri)=null # URL to which Telnyx will deliver your XML Translator webhooks if we get an error response from your voice_url., call_cost_in_webhooks: bool=false # Specifies if call cost webhooks should be sent for this TeXML Application., voice_method: str(get/post)=post # HTTP request method Telnyx will use to interact with your XML Translator webhooks. Either 'get' or 'post'., status_callback: str(uri)=null # URL for Telnyx to send requests to containing information about call progress events., status_callback_method: str(get/post)=post # HTTP request method Telnyx should use when requesting the status_callback URL., tags: [str] # Tags associated with the Texml Application., inbound: map{channel_limit: int, shaken_stir_enabled: bool, sip_subdomain: str, sip_subdomain_receive_settings: str}, outbound: map{channel_limit: int, outbound_voice_profile_id: str}}\n@returns(200) {data: map{id: str, record_type: str, friendly_name: str, active: bool, anchorsite_override: str, dtmf_type: str, first_command_timeout: bool, first_command_timeout_secs: int, voice_url: str(uri), voice_fallback_url: str(uri), call_cost_in_webhooks: bool, voice_method: str, status_callback: str(uri), status_callback_method: str, tags: [str], inbound: map{channel_limit: int, shaken_stir_enabled: bool, sip_subdomain: str, sip_subdomain_receive_settings: str}, outbound: map{channel_limit: int, outbound_voice_profile_id: str}, created_at: str, updated_at: str}} # Successful response\n@errors {400: Bad request. The request could not be understood or was missing required parameters., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist., 409: Conflict. Another update to this application is still in progress. Wait and retry the request later., 422: Unprocessable entity. The request was well-formed but contains semantic errors.}\n\n@endgroup\n\n@group text-to-speech\n@endpoint GET /text-to-speech/speech\n@desc Stream text to speech over WebSocket\n@optional {voice: str # Voice identifier in the format `provider.model_id.voice_id` or `provider.voice_id` (e.g. `Telnyx.Ultra.`, `Telnyx.Bayan.Ahmed`, `Telnyx.Sukhan.urdu-professor`, or `azure.en-US-AvaMultilingualNeural`). When provided, the `provider`, `model_id`, and `voice_id` are extracted automatically. Takes precedence over individual `provider`/`model_id`/`voice_id` parameters., provider: str(aws/telnyx/azure/elevenlabs/minimax/resemble/xai/humain/soniox)=telnyx # TTS provider. Defaults to `telnyx` if not specified. Ignored when `voice` is provided., model_id: str # Model identifier for the chosen provider. Examples: `Ultra`, `KokoroTTS` (Telnyx); `Polly.Generative` (AWS)., voice_id: str # Voice identifier for the chosen provider., disable_cache: bool=false # When `true`, bypass the audio cache and generate fresh audio., audio_format: str(pcm/wav/mp3) # Audio output format override. Supported for Telnyx models. The `Ultra` model outputs PCM at 24kHz s16le or MP3 at 128kbps 24kHz., socket_id: str # Client-provided socket identifier for tracking. If not provided, one is generated server-side.}\n@returns(200) WebSocket upgrade successful — this response is not returned directly. See 101 for frame documentation.\n@errors {101: WebSocket connection established. Communication proceeds via JSON frames.  **Client → Server:** See `ClientTextFrame` schema. **Server → Client:** See `AudioChunkFrame`, `FinalFrame`, and `ErrorFrame` schemas., 400: Invalid parameters — provider not supported or missing required fields., 401: Authentication failed — missing or invalid `x-telnyx-auth-rev2` header.}\n\n@endpoint POST /text-to-speech/speech\n@desc Generate speech from text\n@optional {voice: str # Voice identifier in the format `provider.model_id.voice_id` or `provider.voice_id`. Examples: `Telnyx.Ultra.`, `Telnyx.Bayan.Ahmed`, `Telnyx.Sukhan.urdu-professor`, `azure.en-US-AvaMultilingualNeural`, `aws.Polly.Generative.Lucia`. When provided, `provider`, `model_id`, and `voice_id` are extracted automatically and take precedence over individual parameters., text: str # The text to convert to speech., provider: str(aws/telnyx/azure/elevenlabs/minimax/resemble/xai/humain/soniox) # TTS provider. Required unless `voice` is provided., language: str # Language code (e.g. `en-US`). Usage varies by provider., text_type: str(text/ssml) # Text type. Use `ssml` for SSML-formatted input (supported by AWS and Azure)., output_type: str(binary_output/base64_output)=binary_output # Determines the response format. `binary_output` returns raw audio bytes, `base64_output` returns base64-encoded audio in JSON., disable_cache: bool=false # When `true`, bypass the audio cache and generate fresh audio., voice_settings: map # Provider-specific voice settings. Contents vary by provider — see provider-specific parameter objects below., aws: map{language_code: str, text_type: str, lexicon_names: [str], output_format: str, sample_rate: str} # AWS Polly provider-specific parameters., telnyx: map{voice_speed: num(float), response_format: str, sampling_rate: int, volume: num(float), emotion: str} # Telnyx provider-specific parameters. For the `Ultra` model, use `voice_speed`, `volume`, and `emotion`. `Bayan` and `Sukhan` don't use `temperature`, `volume`, or `emotion`, and don't support `voice_speed`. `Sukhan`'s `response_format` is restricted to `mp3` or `pcm` (no `wav`)., azure: map{language_code: str, output_format: str, text_type: str, api_key: str, region: str, deployment_id: str, effect: str, gender: str} # Azure Cognitive Services provider-specific parameters., elevenlabs: map{language_code: str, api_key: str, voice_settings: map} # ElevenLabs provider-specific parameters., minimax: map{speed: num(float), vol: num(float), pitch: int, response_format: str, language_boost: str} # Minimax provider-specific parameters., resemble: map{api_key: str, precision: str, sample_rate: str, format: str} # Resemble AI provider-specific parameters., xai: map{voice_id!: str, language: str, output_format: str, sample_rate: int} # xAI provider-specific parameters., humain: map{voice_id!: str, ttfb_eagerness: num(float)} # Humain provider-specific parameters. Unlike other providers, Humain has no format/sample-rate negotiation (output is always PCM16 24kHz mono) and no language parameter — language is fixed per voice., soniox: map{voice_id!: str, model_id: str, language: str, speed: num(float), reduce_silence: bool, audio_format: str, sample_rate: int} # Soniox provider-specific parameters. Every voice speaks all supported languages; set `language` to the language of the text.}\n@returns(200) {base64_audio: str} # Speech generated successfully. The response format depends on the `output_type` parameter: - `binary_output` (default): Returns raw audio bytes with the appropriate `Content-Type` header. Most providers return `audio/mpeg`; `humain` has no MP3 output and always returns raw headerless PCM16LE 24kHz mono as `audio/pcm`. - `base64_output`: Returns a JSON object with `base64_audio` field.\n@errors {400: Bad request — invalid parameters or provider error., 401: Authentication failed — missing or invalid API key., 422: Validation failed — invalid or missing required fields.}\n@example_request {\"voice\":\"string\",\"text\":\"string\",\"provider\":\"aws\",\"language\":\"string\",\"text_type\":\"text\",\"output_type\":\"binary_output\",\"disable_cache\":false,\"aws\":{\"language_code\":\"string\",\"text_type\":\"text\",\"lexicon_names\":[\"string\"],\"output_format\":\"string\",\"sample_rate\":\"string\"},\"telnyx\":{\"voice_speed\":1,\"response_format\":\"mp3\",\"sampling_rate\":24000,\"volume\":1,\"emotion\":\"neutral\"},\"azure\":{\"language_code\":\"en-US\",\"output_format\":\"audio-24khz-160kbitrate-mono-mp3\",\"text_type\":\"text\",\"api_key\":\"string\",\"region\":\"string\",\"deployment_id\":\"string\",\"effect\":\"string\",\"gender\":\"string\"},\"elevenlabs\":{\"language_code\":\"string\",\"api_key\":\"string\"},\"minimax\":{\"speed\":0,\"vol\":0,\"pitch\":0,\"response_format\":\"string\",\"language_boost\":\"string\"},\"resemble\":{\"api_key\":\"string\",\"precision\":\"string\",\"sample_rate\":\"string\",\"format\":\"string\"},\"xai\":{\"voice_id\":\"eve\",\"language\":\"auto\",\"output_format\":\"mp3\",\"sample_rate\":24000},\"humain\":{\"voice_id\":\"sara-en\",\"ttfb_eagerness\":0},\"soniox\":{\"voice_id\":\"Emma\",\"model_id\":\"tts-rt-v2\",\"language\":\"en\",\"speed\":1,\"audio_format\":\"mp3\"}}\n\n@endpoint GET /text-to-speech/voices\n@desc List available voices\n@optional {provider: str(aws/telnyx/azure/elevenlabs/minimax/resemble/xai/humain/soniox) # Filter voices by provider. If omitted, voices from all providers are returned., api_key: str # API key for providers that require one to list voices (e.g. ElevenLabs).}\n@returns(200) {voices: [map]} # List of available voices.\n@errors {400: Bad request — invalid provider or missing required API key., 401: Authentication failed — missing or invalid API key.}\n\n@endgroup\n\n@group traffic\n@endpoint GET /traffic/policy/profiles\n@desc Get all traffic policy profiles\n@optional {page[number]: int=1: any # The page number to load., page[size]: int=20 # The size of the page., filter[type]: str(whitelist/blacklist/throttling) # Filter by traffic policy profile type., filter[service]: str # Filter by service ID., sort: str(service/-service/type/-type) # Sorts traffic policy profiles by the given field. Defaults to ascending order unless field is prefixed with a minus sign.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {401: Unauthorized}\n\n@endpoint POST /traffic/policy/profiles\n@desc Create a traffic policy profile\n@required {type: str(whitelist/blacklist) # The type of the traffic policy profile.}\n@optional {services: [str] # Array of PCEF service IDs to include in the profile., ip_ranges: [str] # Array of IP ranges in CIDR notation., domains: [str] # Array of domain names., limit_bw_kbps: int(512/1024) # Bandwidth limit in kbps. Must be 512 or 1024.}\n@returns(201) {data: map{id: str(uuid), record_type: str, type: str, services: [str], ip_ranges: [str], domains: [str], limit_bw_kbps: int?, created_at: str, updated_at: str}} # Successful Response\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint GET /traffic/policy/profiles/services\n@desc Get all available traffic policy profile services\n@optional {page[number]: int=1: any # The page number to load., page[size]: int=20 # The size of the page., filter[group]: str # Filter services by group., filter[name]: str # Filter services by name.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {401: Unauthorized}\n\n@endpoint DELETE /traffic/policy/profiles/{id}\n@desc Delete a traffic policy profile\n@required {id: str(uuid) # Identifies the traffic policy profile.}\n@returns(200) {data: map{id: str(uuid)}} # Successful Response\n@errors {404: Resource not found}\n\n@endpoint GET /traffic/policy/profiles/{id}\n@desc Get a traffic policy profile\n@required {id: str(uuid) # Identifies the traffic policy profile.}\n@returns(200) {data: map{id: str(uuid), record_type: str, type: str, services: [str], ip_ranges: [str], domains: [str], limit_bw_kbps: int?, created_at: str, updated_at: str}} # Successful Response\n@errors {404: Resource not found}\n\n@endpoint PATCH /traffic/policy/profiles/{id}\n@desc Update a traffic policy profile\n@required {id: str(uuid) # Identifies the traffic policy profile.}\n@optional {type: str(whitelist/blacklist/throttling) # The type of the traffic policy profile., services: [str] # Array of PCEF service IDs to include in the profile., ip_ranges: [str] # Array of IP ranges in CIDR notation., domains: [str] # Array of domain names., limit_bw_kbps: int(512/1024) # Bandwidth limit in kbps. Must be 512 or 1024, or null to remove.}\n@returns(200) {data: map{id: str(uuid), record_type: str, type: str, services: [str], ip_ranges: [str], domains: [str], limit_bw_kbps: int?, created_at: str, updated_at: str}} # Successful Response\n@errors {404: Resource not found, 422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endgroup\n\n@group traffic_policy_profiles\n@endpoint GET /traffic_policy_profiles\n@desc Get all traffic policy profiles\n@optional {page[number]: int=1: any # The page number to load., page[size]: int=20 # The size of the page., filter[type]: str(whitelist/blacklist/throttling) # Filter by traffic policy profile type., filter[service]: str # Filter by service ID., sort: str(service/-service/type/-type) # Sorts traffic policy profiles by the given field. Defaults to ascending order unless field is prefixed with a minus sign.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {401: Unauthorized}\n\n@endpoint POST /traffic_policy_profiles\n@desc Create a traffic policy profile\n@required {type: str(whitelist/blacklist) # The type of the traffic policy profile.}\n@optional {services: [str] # Array of PCEF service IDs to include in the profile., ip_ranges: [str] # Array of IP ranges in CIDR notation., domains: [str] # Array of domain names., limit_bw_kbps: int(512/1024) # Bandwidth limit in kbps. Must be 512 or 1024.}\n@returns(201) {data: map{id: str(uuid), record_type: str, type: str, services: [str], ip_ranges: [str], domains: [str], limit_bw_kbps: int?, created_at: str, updated_at: str}} # Successful Response\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint GET /traffic_policy_profiles/services\n@desc Get all available traffic policy profile services\n@optional {page[number]: int=1: any # The page number to load., page[size]: int=20 # The size of the page., filter[group]: str # Filter services by group., filter[name]: str # Filter services by name.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {401: Unauthorized}\n\n@endpoint DELETE /traffic_policy_profiles/{id}\n@desc Delete a traffic policy profile\n@required {id: str(uuid) # Identifies the traffic policy profile.}\n@returns(200) {data: map{id: str(uuid)}} # Successful Response\n@errors {404: Resource not found}\n\n@endpoint GET /traffic_policy_profiles/{id}\n@desc Get a traffic policy profile\n@required {id: str(uuid) # Identifies the traffic policy profile.}\n@returns(200) {data: map{id: str(uuid), record_type: str, type: str, services: [str], ip_ranges: [str], domains: [str], limit_bw_kbps: int?, created_at: str, updated_at: str}} # Successful Response\n@errors {404: Resource not found}\n\n@endpoint PATCH /traffic_policy_profiles/{id}\n@desc Update a traffic policy profile\n@required {id: str(uuid) # Identifies the traffic policy profile.}\n@optional {type: str(whitelist/blacklist/throttling) # The type of the traffic policy profile., services: [str] # Array of PCEF service IDs to include in the profile., ip_ranges: [str] # Array of IP ranges in CIDR notation., domains: [str] # Array of domain names., limit_bw_kbps: int(512/1024) # Bandwidth limit in kbps. Must be 512 or 1024, or null to remove.}\n@returns(200) {data: map{id: str(uuid), record_type: str, type: str, services: [str], ip_ranges: [str], domains: [str], limit_bw_kbps: int?, created_at: str, updated_at: str}} # Successful Response\n@errors {404: Resource not found, 422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endgroup\n\n@group uac_connections\n@endpoint GET /uac_connections\n@desc List UAC connections\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[connection_name], filter[fqdn], filter[outbound_voice_profile_id], filter[outbound.outbound_voice_profile_id], page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], sort: str(created_at/connection_name/active)=created_at # Specifies the sort order for results. By default sorting direction is ascending. To have the results sorted in descending order add the  - prefix. That is:         connection_name: sorts the result by the     connection_name field in ascending order.            -connection_name: sorts the result by the     connection_name field in descending order.      If not given, results are sorted by created_at in descending order.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with a list of UAC connections.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action.}\n\n@endpoint POST /uac_connections\n@desc Create a UAC connection\n@required {connection_name: str # A user-assigned name to help manage the connection.}\n@optional {active: bool # Defaults to true, user_name: str # The user name to be used as part of the credentials. Must be 4-32 characters long and alphanumeric values only (no spaces or special characters)., password: str # The password to be used as part of the credentials. Must be 8 to 128 characters long., anchorsite_override: str(Latency/Chicago, IL/Ashburn, VA/San Jose, CA/Sydney, Australia/Amsterdam, Netherlands/London, UK/Toronto, Canada/Vancouver, Canada/Frankfurt, Germany)=Latency # `Latency` directs Telnyx to route media through the site with the lowest round-trip time to the user's connection. Telnyx calculates this time using ICMP ping messages. This can be disabled by specifying a site to handle all media., sip_uri_calling_preference: str(disabled/unrestricted/internal) # This feature enables inbound SIP URI calls to your Credential Auth Connection. If enabled for all (unrestricted) then anyone who calls the SIP URI @telnyx.com will be connected to your Connection. You can also choose to allow only calls that are originated on any Connections under your account (internal)., default_on_hold_comfort_noise_enabled: bool=false # When enabled, Telnyx will generate comfort noise when you place the call on hold. If disabled, you will need to generate comfort noise or on hold music to avoid RTP timeout., dtmf_type: str(RFC 2833/Inband/SIP INFO)=RFC 2833 # Sets the type of DTMF digits sent from Telnyx to this Connection. Note that DTMF digits sent to Telnyx will be accepted in all formats., encode_contact_header_enabled: bool=false # Encode the SIP contact header sent by Telnyx to avoid issues for NAT or ALG scenarios., encrypted_media: str # Enable use of SRTP for encryption. Cannot be set if the transport_portocol is TLS., onnet_t38_passthrough_enabled: bool=false # Enable on-net T38 if you prefer the sender and receiver negotiating T38 directly if both are on the Telnyx network. If this is disabled, Telnyx will be able to use T38 on just one leg of the call depending on each leg's settings., ios_push_credential_id: str=null # The uuid of the push credential for Ios, android_push_credential_id: str=null # The uuid of the push credential for Android, webhook_event_url: str(uri) # The URL where webhooks related to this connection will be sent. Must include a scheme, such as 'https'., webhook_event_failover_url: str(uri)= # The failover URL where webhooks related to this connection will be sent if sending to the primary URL fails. Must include a scheme, such as 'https'., webhook_api_version: str(1/2/texml)=1 # Determines which webhook format will be used, Telnyx API v1, v2 or texml. Note - texml can only be set when the outbound object parameter call_parking_enabled is included and set to true., webhook_timeout_secs: int=null # Specifies how many seconds to wait before timing out a webhook., call_cost_in_webhooks: bool=false # Specifies if call cost webhooks should be sent for this connection., tags: [str] # Tags associated with the connection., rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_routing_method: str, channel_limit: int, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, sip_region: str, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool, simultaneous_ringing: str} # Inbound settings that can be supplied when creating or updating a UAC connection. The SIP subdomain fields returned in UAC connection responses are generated by Telnyx and are not accepted as request parameters., outbound: map{call_parking_enabled: bool, ani_override: str, ani_override_type: str, channel_limit: int, instant_ringback_enabled: bool, generate_ringback_tone: bool, localization: str, t38_reinvite_source: str, outbound_voice_profile_id: str}, noise_suppression: str(inbound/outbound/both/disabled) # Controls when noise suppression is applied to calls. When set to 'inbound', noise suppression is applied to incoming audio. When set to 'outbound', it's applied to outgoing audio. When set to 'both', it's applied in both directions. When set to 'disabled', noise suppression is turned off., noise_suppression_details: map{engine: str, attenuation_limit: int} # Configuration options for noise suppression. These settings are stored regardless of the noise_suppression value, but only take effect when noise_suppression is not 'disabled'. If you disable noise suppression and later re-enable it, the previously configured settings will be used., jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int} # Configuration options for Jitter Buffer. Enables Jitter Buffer for RTP streams of SIP Trunking calls. The feature is off unless enabled. You may define min and max values in msec for customized buffering behaviors. Larger values add latency but tolerate more jitter, while smaller values reduce latency but are more sensitive to jitter and reordering., internal_uac_settings: map{destination_uri: str} # Internal Telnyx-side settings for a UAC connection., external_uac_settings: map{username: str, password: str, proxy: str, auth_username: str, from_user: str, outbound_proxy: str, expiration_sec: int, transport: str, user_agent: str} # External SIP peer settings used by Telnyx when registering to your PBX and routing outbound calls.}\n@returns(201) {data: map{id: str, record_type: str, active: bool, user_name: str, password: str, created_at: str, updated_at: str, anchorsite_override: str, connection_name: str, sip_uri_calling_preference: str, default_on_hold_comfort_noise_enabled: bool, dtmf_type: str, encode_contact_header_enabled: bool, encrypted_media: str?, onnet_t38_passthrough_enabled: bool, ios_push_credential_id: str?, android_push_credential_id: str?, webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_api_version: str, webhook_timeout_secs: int?, call_cost_in_webhooks: bool, tags: [str], rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_routing_method: str, channel_limit: int, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, sip_region: str, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool, simultaneous_ringing: str, sip_subdomain: str, sip_subdomain_receive_settings: str}, outbound: map{call_parking_enabled: bool?, ani_override: str, ani_override_type: str, channel_limit: int, instant_ringback_enabled: bool, generate_ringback_tone: bool, localization: str, t38_reinvite_source: str, outbound_voice_profile_id: str}, noise_suppression: str, noise_suppression_details: map{engine: str, attenuation_limit: int}, jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int}, authentication: str, registration_status: str?, registration_status_updated_at: str?, fqdn: str, fqdns: [map], fqdn_outbound_authentication: str, internal_uac_settings: map{destination_uri: str}, external_uac_settings: map{username: str, password: str, proxy: str, auth_username: str?, from_user: str?, outbound_proxy: str?, expiration_sec: int?, transport: str?, user_agent: str?}}} # Successful response with details about a UAC connection.\n@errors {401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 422: The request was well-formed but was unable to be followed due to semantic errors.}\n\n@endpoint DELETE /uac_connections/{id}\n@desc Delete a UAC connection\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{id: str, record_type: str, active: bool, user_name: str, password: str, created_at: str, updated_at: str, anchorsite_override: str, connection_name: str, sip_uri_calling_preference: str, default_on_hold_comfort_noise_enabled: bool, dtmf_type: str, encode_contact_header_enabled: bool, encrypted_media: str?, onnet_t38_passthrough_enabled: bool, ios_push_credential_id: str?, android_push_credential_id: str?, webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_api_version: str, webhook_timeout_secs: int?, call_cost_in_webhooks: bool, tags: [str], rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_routing_method: str, channel_limit: int, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, sip_region: str, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool, simultaneous_ringing: str, sip_subdomain: str, sip_subdomain_receive_settings: str}, outbound: map{call_parking_enabled: bool?, ani_override: str, ani_override_type: str, channel_limit: int, instant_ringback_enabled: bool, generate_ringback_tone: bool, localization: str, t38_reinvite_source: str, outbound_voice_profile_id: str}, noise_suppression: str, noise_suppression_details: map{engine: str, attenuation_limit: int}, jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int}, authentication: str, registration_status: str?, registration_status_updated_at: str?, fqdn: str, fqdns: [map], fqdn_outbound_authentication: str, internal_uac_settings: map{destination_uri: str}, external_uac_settings: map{username: str, password: str, proxy: str, auth_username: str?, from_user: str?, outbound_proxy: str?, expiration_sec: int?, transport: str?, user_agent: str?}}} # Successful response with details about a UAC connection.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist.}\n\n@endpoint GET /uac_connections/{id}\n@desc Retrieve a UAC connection\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{id: str, record_type: str, active: bool, user_name: str, password: str, created_at: str, updated_at: str, anchorsite_override: str, connection_name: str, sip_uri_calling_preference: str, default_on_hold_comfort_noise_enabled: bool, dtmf_type: str, encode_contact_header_enabled: bool, encrypted_media: str?, onnet_t38_passthrough_enabled: bool, ios_push_credential_id: str?, android_push_credential_id: str?, webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_api_version: str, webhook_timeout_secs: int?, call_cost_in_webhooks: bool, tags: [str], rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_routing_method: str, channel_limit: int, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, sip_region: str, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool, simultaneous_ringing: str, sip_subdomain: str, sip_subdomain_receive_settings: str}, outbound: map{call_parking_enabled: bool?, ani_override: str, ani_override_type: str, channel_limit: int, instant_ringback_enabled: bool, generate_ringback_tone: bool, localization: str, t38_reinvite_source: str, outbound_voice_profile_id: str}, noise_suppression: str, noise_suppression_details: map{engine: str, attenuation_limit: int}, jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int}, authentication: str, registration_status: str?, registration_status_updated_at: str?, fqdn: str, fqdns: [map], fqdn_outbound_authentication: str, internal_uac_settings: map{destination_uri: str}, external_uac_settings: map{username: str, password: str, proxy: str, auth_username: str?, from_user: str?, outbound_proxy: str?, expiration_sec: int?, transport: str?, user_agent: str?}}} # Successful response with details about a UAC connection.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist.}\n\n@endpoint PATCH /uac_connections/{id}\n@desc Update a UAC connection\n@required {id: str # Identifies the resource.}\n@optional {active: bool # Defaults to true, user_name: str # The user name to be used as part of the credentials. Must be 4-32 characters long and alphanumeric values only (no spaces or special characters)., password: str # The password to be used as part of the credentials. Must be 8 to 128 characters long., anchorsite_override: str(Latency/Chicago, IL/Ashburn, VA/San Jose, CA/Sydney, Australia/Amsterdam, Netherlands/London, UK/Toronto, Canada/Vancouver, Canada/Frankfurt, Germany)=Latency # `Latency` directs Telnyx to route media through the site with the lowest round-trip time to the user's connection. Telnyx calculates this time using ICMP ping messages. This can be disabled by specifying a site to handle all media., connection_name: str # A user-assigned name to help manage the connection., sip_uri_calling_preference: str(disabled/unrestricted/internal) # This feature enables inbound SIP URI calls to your Credential Auth Connection. If enabled for all (unrestricted) then anyone who calls the SIP URI @telnyx.com will be connected to your Connection. You can also choose to allow only calls that are originated on any Connections under your account (internal)., default_on_hold_comfort_noise_enabled: bool=false # When enabled, Telnyx will generate comfort noise when you place the call on hold. If disabled, you will need to generate comfort noise or on hold music to avoid RTP timeout., dtmf_type: str(RFC 2833/Inband/SIP INFO)=RFC 2833 # Sets the type of DTMF digits sent from Telnyx to this Connection. Note that DTMF digits sent to Telnyx will be accepted in all formats., encode_contact_header_enabled: bool=false # Encode the SIP contact header sent by Telnyx to avoid issues for NAT or ALG scenarios., encrypted_media: str # Enable use of SRTP for encryption. Cannot be set if the transport_portocol is TLS., onnet_t38_passthrough_enabled: bool=false # Enable on-net T38 if you prefer the sender and receiver negotiating T38 directly if both are on the Telnyx network. If this is disabled, Telnyx will be able to use T38 on just one leg of the call depending on each leg's settings., ios_push_credential_id: str=null # The uuid of the push credential for Ios, android_push_credential_id: str=null # The uuid of the push credential for Android, webhook_event_url: str(uri) # The URL where webhooks related to this connection will be sent. Must include a scheme, such as 'https'., webhook_event_failover_url: str(uri)= # The failover URL where webhooks related to this connection will be sent if sending to the primary URL fails. Must include a scheme, such as 'https'., webhook_api_version: str(1/2)=1 # Determines which webhook format will be used, Telnyx API v1 or v2., webhook_timeout_secs: int=null # Specifies how many seconds to wait before timing out a webhook., call_cost_in_webhooks: bool=false # Specifies if call cost webhooks should be sent for this connection., tags: [str] # Tags associated with the connection., rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_routing_method: str, channel_limit: int, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, sip_region: str, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool, simultaneous_ringing: str} # Inbound settings that can be supplied when creating or updating a UAC connection. The SIP subdomain fields returned in UAC connection responses are generated by Telnyx and are not accepted as request parameters., outbound: map{call_parking_enabled: bool, ani_override: str, ani_override_type: str, channel_limit: int, instant_ringback_enabled: bool, generate_ringback_tone: bool, localization: str, t38_reinvite_source: str, outbound_voice_profile_id: str}, noise_suppression: str(inbound/outbound/both/disabled) # Controls when noise suppression is applied to calls. When set to 'inbound', noise suppression is applied to incoming audio. When set to 'outbound', it's applied to outgoing audio. When set to 'both', it's applied in both directions. When set to 'disabled', noise suppression is turned off., noise_suppression_details: map{engine: str, attenuation_limit: int} # Configuration options for noise suppression. These settings are stored regardless of the noise_suppression value, but only take effect when noise_suppression is not 'disabled'. If you disable noise suppression and later re-enable it, the previously configured settings will be used., jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int} # Configuration options for Jitter Buffer. Enables Jitter Buffer for RTP streams of SIP Trunking calls. The feature is off unless enabled. You may define min and max values in msec for customized buffering behaviors. Larger values add latency but tolerate more jitter, while smaller values reduce latency but are more sensitive to jitter and reordering., internal_uac_settings: map{destination_uri: str} # Internal Telnyx-side settings for a UAC connection., external_uac_settings: map{username: str, password: str, proxy: str, auth_username: str, from_user: str, outbound_proxy: str, expiration_sec: int, transport: str, user_agent: str} # External SIP peer settings used by Telnyx when registering to your PBX and routing outbound calls.}\n@returns(200) {data: map{id: str, record_type: str, active: bool, user_name: str, password: str, created_at: str, updated_at: str, anchorsite_override: str, connection_name: str, sip_uri_calling_preference: str, default_on_hold_comfort_noise_enabled: bool, dtmf_type: str, encode_contact_header_enabled: bool, encrypted_media: str?, onnet_t38_passthrough_enabled: bool, ios_push_credential_id: str?, android_push_credential_id: str?, webhook_event_url: str(uri), webhook_event_failover_url: str(uri)?, webhook_api_version: str, webhook_timeout_secs: int?, call_cost_in_webhooks: bool, tags: [str], rtcp_settings: map{port: str, capture_enabled: bool, report_frequency_secs: int}, inbound: map{ani_number_format: str, dnis_number_format: str, codecs: [str], default_routing_method: str, channel_limit: int, generate_ringback_tone: bool, isup_headers_enabled: bool, prack_enabled: bool, sip_compact_headers_enabled: bool, sip_region: str, timeout_1xx_secs: int, timeout_2xx_secs: int, shaken_stir_enabled: bool, simultaneous_ringing: str, sip_subdomain: str, sip_subdomain_receive_settings: str}, outbound: map{call_parking_enabled: bool?, ani_override: str, ani_override_type: str, channel_limit: int, instant_ringback_enabled: bool, generate_ringback_tone: bool, localization: str, t38_reinvite_source: str, outbound_voice_profile_id: str}, noise_suppression: str, noise_suppression_details: map{engine: str, attenuation_limit: int}, jitter_buffer: map{enable_jitter_buffer: bool, jitterbuffer_msec_min: int, jitterbuffer_msec_max: int}, authentication: str, registration_status: str?, registration_status_updated_at: str?, fqdn: str, fqdns: [map], fqdn_outbound_authentication: str, internal_uac_settings: map{destination_uri: str}, external_uac_settings: map{username: str, password: str, proxy: str, auth_username: str?, from_user: str?, outbound_proxy: str?, expiration_sec: int?, transport: str?, user_agent: str?}}} # Successful response with details about a UAC connection.\n@errors {401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist., 409: Conflict. Another update to this connection is still in progress. Wait and retry the request later., 422: The request was well-formed but was unable to be followed due to semantic errors.}\n\n@endpoint POST /uac_connections/{id}/actions/check_registration_status\n@desc Check a UAC Connection Registration Status\n@required {id: str # Identifies the resource.}\n@returns(200) {data: map{record_type: str, status: str, sip_username: str?, ip_address: str?, transport: str?, port: int?, user_agent: str?, last_registration: str?}} # Successful response with details about a credential connection registration status.\n@errors {400: Bad request, the request was unacceptable, often due to missing a required parameter., 401: Unauthorized, 403: The user doesn't have the required permissions to perform the requested action., 404: The requested resource doesn't exist.}\n\n@endgroup\n\n@group usage_reports\n@endpoint GET /usage_reports\n@desc Get Telnyx product usage data (BETA)\n@required {product: str # Telnyx product, dimensions: [str] # Breakout by specified product dimensions, metrics: [str] # Specified product usage values}\n@optional {start_date: str # The start date for the time range you are interested in. The maximum time range is 31 days. Format: YYYY-MM-DDTHH:mm:ssZ, end_date: str # The end date for the time range you are interested in. The maximum time range is 31 days. Format: YYYY-MM-DDTHH:mm:ssZ, date_range: str # A more user-friendly way to specify the timespan you want to filter by. More options can be found in the Telnyx API Reference docs., filter: str # Filter records on dimensions, managed_accounts: bool # Return the aggregations for all Managed Accounts under the user making the request., sort: [str] # Specifies the sort order for results, format: str(csv/json) # Specify the response format (csv or json). JSON is returned by default, even if not specified., authorization_bearer: str # Bearer token used to authenticate the request., page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}, data: [map]} # Successful\n@errors {400: Bad Request, 500: Internal Server Error}\n\n@endpoint GET /usage_reports/options\n@desc Get Usage Reports query options (BETA)\n@optional {product: str # Options (dimensions and metrics) for a given product. If none specified, all products will be returned., authorization_bearer: str # Bearer token used to authenticate the request.}\n@returns(200) {data: [map]} # Successful\n@errors {400: Bad Request, 500: Internal Server Error}\n\n@endgroup\n\n@group user\n@endpoint GET /user/addresses\n@desc List all user addresses\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[customer_reference][eq], filter[customer_reference][contains], filter[street_address][contains], sort: str(created_at/first_name/last_name/business_name/street_address)=created_at # Specifies the sort order for results. By default sorting direction is ascending. To have the results sorted in descending order add the  - prefix. That is:         street_address: sorts the result by the     street_address field in ascending order.            -street_address: sorts the result by the     street_address field in descending order.      If not given, results are sorted by created_at in descending order.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {400: Bad request, 401: Unauthorized, 404: Resource not found}\n\n@endpoint POST /user/addresses\n@desc Creates a user address\n@required {first_name: str # The first name associated with the user address., last_name: str # The last name associated with the user address., business_name: str # The business name associated with the user address., street_address: str # The primary street address information about the user address., locality: str # The locality of the user address. For US addresses, this corresponds to the city of the address., country_code: str # The two-character (ISO 3166-1 alpha-2) country code of the user address.}\n@optional {customer_reference: str # A customer reference string for customer look ups., phone_number: str # The phone number associated with the user address., extended_address: str # Additional street address information about the user address such as, but not limited to, unit number or apartment number., administrative_area: str # The locality of the user address. For US addresses, this corresponds to the state of the address., neighborhood: str # The neighborhood of the user address. This field is not used for addresses in the US but is used for some international addresses., borough: str # The borough of the user address. This field is not used for addresses in the US but is used for some international addresses., postal_code: str # The postal code of the user address., skip_address_verification: bool=false # An optional boolean value specifying if verification of the address should be skipped or not. UserAddresses are generally used for shipping addresses, and failure to validate your shipping address will likely result in a failure to deliver SIM cards or other items ordered from Telnyx. Do not use this parameter unless you are sure that the address is correct even though it cannot be validated. If this is set to any value other than true, verification of the address will be attempted, and the user address will not be allowed if verification fails. If verification fails but suggested values are available that might make the address correct, they will be present in the response as well. If this value is set to true, then the verification will not be attempted. Defaults to false (verification will be performed).}\n@returns(200) {data: map{id: str(uuid), record_type: str, customer_reference: str, first_name: str, last_name: str, business_name: str, phone_number: str, street_address: str, extended_address: str, locality: str, administrative_area: str, neighborhood: str, borough: str, postal_code: str, country_code: str, created_at: str, updated_at: str}} # Successful response\n@errors {422: Bad request}\n\n@endpoint GET /user/addresses/{id}\n@desc Retrieve a user address\n@required {id: str # user address ID}\n@returns(200) {data: map{id: str(uuid), record_type: str, customer_reference: str, first_name: str, last_name: str, business_name: str, phone_number: str, street_address: str, extended_address: str, locality: str, administrative_area: str, neighborhood: str, borough: str, postal_code: str, country_code: str, created_at: str, updated_at: str}} # Successful response\n@errors {401: Unauthorized, 404: Resource not found, 422: Bad request}\n\n@endgroup\n\n@group user_addresses\n@endpoint GET /user_addresses\n@desc List all user addresses\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[customer_reference][eq], filter[customer_reference][contains], filter[street_address][contains], sort: str(created_at/first_name/last_name/business_name/street_address)=created_at # Specifies the sort order for results. By default sorting direction is ascending. To have the results sorted in descending order add the  - prefix. That is:         street_address: sorts the result by the     street_address field in ascending order.            -street_address: sorts the result by the     street_address field in descending order.      If not given, results are sorted by created_at in descending order.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {400: Bad request, 401: Unauthorized, 404: Resource not found}\n\n@endpoint POST /user_addresses\n@desc Creates a user address\n@required {first_name: str # The first name associated with the user address., last_name: str # The last name associated with the user address., business_name: str # The business name associated with the user address., street_address: str # The primary street address information about the user address., locality: str # The locality of the user address. For US addresses, this corresponds to the city of the address., country_code: str # The two-character (ISO 3166-1 alpha-2) country code of the user address.}\n@optional {customer_reference: str # A customer reference string for customer look ups., phone_number: str # The phone number associated with the user address., extended_address: str # Additional street address information about the user address such as, but not limited to, unit number or apartment number., administrative_area: str # The locality of the user address. For US addresses, this corresponds to the state of the address., neighborhood: str # The neighborhood of the user address. This field is not used for addresses in the US but is used for some international addresses., borough: str # The borough of the user address. This field is not used for addresses in the US but is used for some international addresses., postal_code: str # The postal code of the user address., skip_address_verification: bool=false # An optional boolean value specifying if verification of the address should be skipped or not. UserAddresses are generally used for shipping addresses, and failure to validate your shipping address will likely result in a failure to deliver SIM cards or other items ordered from Telnyx. Do not use this parameter unless you are sure that the address is correct even though it cannot be validated. If this is set to any value other than true, verification of the address will be attempted, and the user address will not be allowed if verification fails. If verification fails but suggested values are available that might make the address correct, they will be present in the response as well. If this value is set to true, then the verification will not be attempted. Defaults to false (verification will be performed).}\n@returns(200) {data: map{id: str(uuid), record_type: str, customer_reference: str, first_name: str, last_name: str, business_name: str, phone_number: str, street_address: str, extended_address: str, locality: str, administrative_area: str, neighborhood: str, borough: str, postal_code: str, country_code: str, created_at: str, updated_at: str}} # Successful response\n@errors {422: Bad request}\n\n@endpoint GET /user_addresses/{id}\n@desc Retrieve a user address\n@required {id: str # user address ID}\n@returns(200) {data: map{id: str(uuid), record_type: str, customer_reference: str, first_name: str, last_name: str, business_name: str, phone_number: str, street_address: str, extended_address: str, locality: str, administrative_area: str, neighborhood: str, borough: str, postal_code: str, country_code: str, created_at: str, updated_at: str}} # Successful response\n@errors {401: Unauthorized, 404: Resource not found, 422: Bad request}\n\n@endgroup\n\n@group user_tags\n@endpoint GET /user_tags\n@desc List User Tags\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[starts_with]}\n@returns(200) {data: map{outbound_profile_tags: [str], number_tags: [str]}} # A list of your tags\n@errors {401: Unauthorized}\n\n@endgroup\n\n@group bot_challenge\n@endpoint POST /v2/bot_challenge\n@desc Issue a bot challenge\n@optional {llm_model_name: str # Name of the LLM the client is using., llm_parameter_count: str # Parameter count of the client LLM., llm_quantization: str # Quantization of the client LLM.}\n@returns(201) {data: map{nonce: str(uuid), problem: str, challenge_type: str, precision: int, terms_and_conditions_url: str, privacy_policy_url: str}} # Challenge issued.\n@errors {400: The JSON request body could not be parsed., 503: No bot challenge problems are currently available.}\n@example_request {\"llm_model_name\":\"claude-opus-4\",\"llm_parameter_count\":\"175B\",\"llm_quantization\":\"int8\"}\n\n@endgroup\n\n@group bot_sessions\n@endpoint GET /v2/bot_sessions\n@desc Exchange a magic link token for a session\n@required {email: str(email) # Email address associated with the magic link token., portal_redirect_token: str(uuid) # Single-use portal redirect (magic link) token, a UUIDv7 sent to the account owner's email.}\n@returns(200) {data: map{api_v2_token: str}} # Session created. Bot signup accounts receive a minimal token envelope.\n@errors {400: The account could not be initialized., 401: Missing or invalid email or token, expired token, or the account is not eligible to sign in (inactive, suspended, not permitted to use magic links, or must use SSO)., 403: Request blocked by security policy (for example, the caller's country is not accepted)., 404: Bot signup is not available (freemium master switch disabled or the caller's country is not enabled).}\n\n@endgroup\n\n@group bot_signup\n@endpoint POST /v2/bot_signup\n@desc Register via bot signup\n@required {terms_of_service: bool # Must be true to accept the terms of service., terms_and_conditions_url: str # Must exactly match the terms-and-conditions URL returned by the challenge endpoint., privacy_policy_url: str # Must exactly match the privacy-policy URL returned by the challenge endpoint., bot_challenge_nonce: str(uuid) # Nonce from a previously issued bot challenge., bot_challenge_answer: str # Answer to the issued bot challenge.}\n@optional {email: str(email) # Email address for the new account. The magic link is sent here. May only be omitted when placeholder-email registration is enabled server-side., terms_of_service_eu: bool # EU terms-of-service acceptance. Required when EU consent enforcement is enabled., terms_and_conditions_eu_url: str # EU terms-and-conditions URL. Required when EU consent enforcement is enabled.}\n@returns(200) {success: bool, message: str} # Registration accepted and a magic link emailed.\n@errors {400: Bot challenge parameters missing or verification failed, terms of service not accepted, or terms/privacy URLs missing or not matching the expected values., 403: Registration blocked by security policy (for example, registration from the caller's country is not accepted)., 404: Bot signup is not available (freemium master switch disabled or the caller's country is not enabled)., 422: Validation failed (for example an invalid email address), or the IP address has reached its bot signup limit., 429: Too many registrations from this email domain.}\n@example_request {\"email\":\"agent-owner@example.com\",\"terms_of_service\":true,\"terms_and_conditions_url\":\"https://telnyx.com/terms-and-conditions-of-service\",\"privacy_policy_url\":\"https://telnyx.com/privacy-policy\",\"bot_challenge_nonce\":\"c6feda4e-6501-4db9-a21f-665e5b4ce2ba\",\"bot_challenge_answer\":\"35\"}\n\n@endpoint POST /v2/bot_signup/resend_magic_link\n@desc Resend a bot signup magic link\n@required {email: str(email) # Email address of the bot signup account to resend the magic link to.}\n@returns(200) {success: bool, message: str} # Uniform acknowledgement, returned whether or not a link was sent.\n@errors {400: The JSON request body could not be parsed., 403: Request blocked by security policy (for example, the caller's country is not accepted)., 404: Bot signup is not available (freemium master switch disabled or the caller's country is not enabled).}\n@example_request {\"email\":\"agent-owner@example.com\"}\n\n@endgroup\n\n@group mobile_phone_numbers\n@endpoint GET /v2/mobile_phone_numbers\n@desc List Mobile Phone Numbers\n@optional {page[number]: int: any # The page number to load, page[size]: int # The size of the page}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {401: Unauthorized}\n\n@endpoint GET /v2/mobile_phone_numbers/{id}\n@desc Retrieve a Mobile Phone Number\n@required {id: str # The ID of the mobile phone number}\n@returns(200) {data: map{id: str, record_type: str, phone_number: str, sim_card_id: str(uuid), status: str, connection_id: str?, connection_name: str?, connection_type: str?, mobile_voice_enabled: bool, tags: [str], customer_reference: str?, created_at: str(date-time), updated_at: str(date-time), call_forwarding: map{call_forwarding_enabled: bool, forwards_to: str?, forwarding_type: str?}, country_iso_alpha2: str, noise_suppression: str, inbound_call_screening: str?, caller_id_name_enabled: bool, call_recording: map{inbound_call_recording_enabled: bool, inbound_call_recording_channels: str, inbound_call_recording_format: str}, cnam_listing: map{cnam_listing_enabled: bool, cnam_listing_details: str?}, outbound: map{interception_app_id: str?, interception_app_name: str?}, inbound: map{interception_app_id: str?, interception_app_name: str?}}} # Successful response\n@errors {404: Resource not found}\n\n@endpoint PATCH /v2/mobile_phone_numbers/{id}\n@desc Update a Mobile Phone Number\n@required {id: str # The ID of the mobile phone number}\n@optional {customer_reference: str, connection_id: str, noise_suppression: bool, inbound_call_screening: str(disabled/reject_calls/flag_calls), caller_id_name_enabled: bool, tags: [str], inbound: map{interception_app_id: str}, outbound: map{interception_app_id: str}, call_forwarding: map{forwards_to: str, forwarding_type: str, call_forwarding_enabled: bool}, cnam_listing: map{cnam_listing_enabled: bool, cnam_listing_details: str}, call_recording: map{inbound_call_recording_enabled: bool, inbound_call_recording_channels: str, inbound_call_recording_format: str}}\n@returns(200) {data: map{id: str, record_type: str, phone_number: str, sim_card_id: str(uuid), status: str, connection_id: str?, connection_name: str?, connection_type: str?, mobile_voice_enabled: bool, tags: [str], customer_reference: str?, created_at: str(date-time), updated_at: str(date-time), call_forwarding: map{call_forwarding_enabled: bool, forwards_to: str?, forwarding_type: str?}, country_iso_alpha2: str, noise_suppression: str, inbound_call_screening: str?, caller_id_name_enabled: bool, call_recording: map{inbound_call_recording_enabled: bool, inbound_call_recording_channels: str, inbound_call_recording_format: str}, cnam_listing: map{cnam_listing_enabled: bool, cnam_listing_details: str?}, outbound: map{interception_app_id: str?, interception_app_name: str?}, inbound: map{interception_app_id: str?, interception_app_name: str?}}} # Successful response\n@errors {422: Unprocessable Entity}\n@example_request {\"noise_suppression\":false,\"inbound_call_screening\":\"disabled\",\"caller_id_name_enabled\":false,\"tags\":[\"string\"],\"call_forwarding\":{\"forwarding_type\":\"always\",\"call_forwarding_enabled\":false},\"cnam_listing\":{\"cnam_listing_enabled\":false},\"call_recording\":{\"inbound_call_recording_enabled\":false,\"inbound_call_recording_channels\":\"single\",\"inbound_call_recording_format\":\"wav\"}}\n\n@endgroup\n\n@group mobile_voice_connections\n@endpoint GET /v2/mobile_voice_connections\n@desc List Mobile Voice Connections\n@optional {page[number]: int: any # The page number to load, page[size]: int # The size of the page, filter[connection_name][contains]: str # Filter by connection name containing the given string, sort: str # Sort by field (e.g., created_at, connection_name, active). Prefix with - for descending order.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {401: Unauthorized}\n\n@endpoint POST /v2/mobile_voice_connections\n@desc Create a Mobile Voice Connection\n@optional {active: bool=true, connection_name: str=Telnyx Mobile Voice IMS, webhook_event_url: str, webhook_event_failover_url: str, webhook_api_version: str(1/2)=2, webhook_timeout_secs: int, tags: [str], outbound: map{channel_limit: int, outbound_voice_profile_id: str}, inbound: map{channel_limit: int}}\n@returns(201) {data: map{id: str, record_type: str, active: bool, connection_name: str, tags: [str], webhook_event_url: str?, webhook_event_failover_url: str?, webhook_api_version: str?, webhook_timeout_secs: int?, outbound: map{channel_limit: int?, outbound_voice_profile_id: str?}, inbound: map{channel_limit: int?}, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {403: Unauthorized or Limit Reached, 422: Unprocessable Entity}\n@example_request {\"active\":true,\"connection_name\":\"Telnyx Mobile Voice IMS\",\"webhook_api_version\":\"2\",\"tags\":[\"string\"],\"outbound\":{\"channel_limit\":0,\"outbound_voice_profile_id\":\"string\"},\"inbound\":{\"channel_limit\":0}}\n\n@endpoint DELETE /v2/mobile_voice_connections/{id}\n@desc Delete a Mobile Voice Connection\n@required {id: str # The ID of the mobile voice connection}\n@returns(200) {data: map{id: str, record_type: str, active: bool, connection_name: str, tags: [str], webhook_event_url: str?, webhook_event_failover_url: str?, webhook_api_version: str?, webhook_timeout_secs: int?, outbound: map{channel_limit: int?, outbound_voice_profile_id: str?}, inbound: map{channel_limit: int?}, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {404: Resource not found}\n\n@endpoint GET /v2/mobile_voice_connections/{id}\n@desc Retrieve a Mobile Voice Connection\n@required {id: str # The ID of the mobile voice connection}\n@returns(200) {data: map{id: str, record_type: str, active: bool, connection_name: str, tags: [str], webhook_event_url: str?, webhook_event_failover_url: str?, webhook_api_version: str?, webhook_timeout_secs: int?, outbound: map{channel_limit: int?, outbound_voice_profile_id: str?}, inbound: map{channel_limit: int?}, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {404: Resource not found}\n\n@endpoint PATCH /v2/mobile_voice_connections/{id}\n@desc Update a Mobile Voice Connection\n@required {id: str # The ID of the mobile voice connection}\n@optional {active: bool, connection_name: str, webhook_event_url: str, webhook_event_failover_url: str, webhook_api_version: str(1/2), webhook_timeout_secs: int, tags: [str], outbound: map{channel_limit: int, outbound_voice_profile_id: str}, inbound: map{channel_limit: int}}\n@returns(200) {data: map{id: str, record_type: str, active: bool, connection_name: str, tags: [str], webhook_event_url: str?, webhook_event_failover_url: str?, webhook_api_version: str?, webhook_timeout_secs: int?, outbound: map{channel_limit: int?, outbound_voice_profile_id: str?}, inbound: map{channel_limit: int?}, created_at: str(date-time), updated_at: str(date-time)}} # Successful response\n@errors {404: Resource not found, 409: Conflict. Another update to this connection is still in progress. Wait and retry the request later., 422: Unprocessable Entity}\n@example_request {\"active\":false,\"connection_name\":\"string\",\"webhook_api_version\":\"1\",\"webhook_timeout_secs\":0,\"tags\":[\"string\"],\"outbound\":{\"channel_limit\":0,\"outbound_voice_profile_id\":\"string\"},\"inbound\":{\"channel_limit\":0}}\n\n@endgroup\n\n@group payment\n@endpoint POST /v2/payment/stored_payment_transactions\n@desc Create a stored payment transaction\n@required {amount: str # Amount in dollars and cents, e.g. \"120.00\"}\n@returns(200) {data: map{id: str, record_type: str, amount_cents: int, processor_status: str, amount_currency: str, created_at: str(date-time), auto_recharge: bool, transaction_processing_type: str}} # Stored payment transaction created successfully\n@errors {401: Unauthorized, 403: Forbidden - insufficient permissions, 422: Unprocessable entity}\n@example_request {\"amount\":\"120.00\"}\n\n@endgroup\n\n@group whatsapp\n@endpoint GET /v2/whatsapp/business_accounts\n@desc List Whatsapp Business Accounts\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with list of Whatsapp business accounts\n@errors {4XX: Unexpected error}\n\n@endpoint DELETE /v2/whatsapp/business_accounts/{id}\n@desc Delete a Whatsapp Business Account\n@required {id: str # Whatsapp Business Account ID}\n@returns(204) Deleted\n@errors {4XX: Unexpected error}\n\n@endpoint GET /v2/whatsapp/business_accounts/{id}\n@desc Get a single Whatsapp Business Account\n@required {id: str # Whatsapp Business Account ID}\n@returns(200) {data: map{id: str(uuid), record_type: str, name: str, waba_id: str, status: str, phone_numbers_count: int, business_verification_status: str, account_review_status: str, country: str, created_at: str(date-time)}} # Successful response with Whatsapp business account\n@errors {4XX: Unexpected error}\n\n@endpoint GET /v2/whatsapp/business_accounts/{id}/phone_numbers\n@desc List phone numbers for a WABA\n@required {id: str # Whatsapp Business Account ID}\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with Whatsapp phone numbers\n@errors {4XX: Unexpected error}\n\n@endpoint POST /v2/whatsapp/business_accounts/{id}/phone_numbers\n@desc Initialize Whatsapp phone number verification\n@required {id: str # Whatsapp Business Account ID, phone_number: str, display_name: str}\n@optional {verification_method: str(sms/voice)=sms, language: str=en_US}\n@returns(204) Verification initiated\n@errors {4XX: Unexpected error}\n@example_request {\"phone_number\":\"string\",\"display_name\":\"string\",\"verification_method\":\"sms\",\"language\":\"en_US\"}\n\n@endpoint GET /v2/whatsapp/business_accounts/{id}/settings\n@desc Get WABA settings\n@required {id: str # Whatsapp Business Account ID}\n@returns(200) {data: map{id: str(uuid), record_type: str, name: str, timezone: str, webhook_url: str(url), webhook_failover_url: str(url), webhook_enabled: bool, webhook_events: [str], updated_at: str(date-time)}} # Successful response with Whatsapp business account settings\n@errors {4XX: Unexpected error}\n\n@endpoint PATCH /v2/whatsapp/business_accounts/{id}/settings\n@desc Update WABA settings\n@required {id: str # Whatsapp Business Account ID}\n@optional {name: str, timezone: str # IANA timezone identifier, webhook_url: str(url) # URL to send Whatsapp events, webhook_failover_url: str(url) # Failover URL to send Whatsapp events, webhook_enabled: bool # Enable/disable receiving Whatsapp events, webhook_events: [str]}\n@returns(200) {data: map{id: str(uuid), record_type: str, name: str, timezone: str, webhook_url: str(url), webhook_failover_url: str(url), webhook_enabled: bool, webhook_events: [str], updated_at: str(date-time)}} # Successful response with Whatsapp business account settings\n@errors {4XX: Unexpected error}\n\n@endpoint GET /v2/whatsapp/message_templates\n@desc List Whatsapp message templates\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size], filter[waba_id]: str # Filter by WABA ID, filter[category]: str(MARKETING/UTILITY/AUTHENTICATION) # Filter by category, filter[status]: str # Filter by template status, filter[search]: str # Search templates by name}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with Whatsapp template\n@errors {4XX: Unexpected error}\n\n@endpoint POST /v2/whatsapp/message_templates\n@desc Create a Whatsapp message template\n@required {waba_id: str # The WhatsApp Business Account ID., name: str # Template name. Lowercase letters, numbers, and underscores only., category: str(MARKETING/UTILITY/AUTHENTICATION) # Template category: AUTHENTICATION, UTILITY, or MARKETING., language: str # Template language code (e.g. en_US, es, pt_BR)., components: [any] # Template components defining message structure. Passed through to Meta Graph API. Templates with variables must include example values. Supports HEADER, BODY, FOOTER, BUTTONS, CAROUSEL and any future Meta component types.}\n@returns(201) {data: map{id: str, record_type: str, template_id: str, name: str, category: str, language: str, status: str, rejection_reason: str, components: [map], whatsapp_business_account: map{id: str}, created_at: str(date-time), updated_at: str(date-time)}} # Successful response with Whatsapp template\n@errors {4XX: Unexpected error}\n\n@endpoint GET /v2/whatsapp/phone_numbers\n@desc List Whatsapp phone numbers\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with Whatsapp phone numbers\n@errors {4XX: Unexpected error}\n\n@endpoint DELETE /v2/whatsapp/phone_numbers/{phone_number}\n@desc Delete a Whatsapp phone number\n@required {phone_number: str # Phone number (E.164 format)}\n@returns(204) Phone number was successfully deleted\n@errors {4XX: Unexpected error}\n\n@endpoint GET /v2/whatsapp/phone_numbers/{phone_number}\n@desc Retrieve a WhatsApp phone number\n@required {phone_number: str # Phone number (E.164 format)}\n@returns(200) {data: map{record_type: str, phone_number: str, phone_number_id: str, waba_id: str, user_id: str, display_name: str, quality_rating: str, status: str, created_at: str(date-time), enabled: bool, calling_enabled: bool, is_on_biz_app: bool, coexistence_state: str?, sync_deadline: str(date-time)?, sync_progress: map?}} # Successful response with one WhatsApp phone number\n@errors {4XX: Unexpected error}\n\n@endpoint GET /v2/whatsapp/phone_numbers/{phone_number}/calling_settings\n@desc Get calling settings for a phone number\n@required {phone_number: str # Phone number (E.164 format)}\n@returns(200) {data: map{record_type: str, phone_number: str, updated_at: str(date-time), enabled: bool}} # Successful response with Whatsapp calling settings\n@errors {4XX: Unexpected error}\n\n@endpoint PATCH /v2/whatsapp/phone_numbers/{phone_number}/calling_settings\n@desc Enable or disable Whatsapp calling for a phone number\n@required {phone_number: str # Phone number (E.164 format), enabled: bool}\n@returns(200) {data: map{record_type: str, phone_number: str, updated_at: str(date-time), enabled: bool}} # Successful response with Whatsapp calling settings\n@errors {4XX: Unexpected error}\n@example_request {\"enabled\":false}\n\n@endpoint GET /v2/whatsapp/phone_numbers/{phone_number}/conversation_window\n@desc Get conversation window status for a phone number\n@required {phone_number: str # Phone number (E.164 format), destination_number: str # Destination phone number in E.164 format}\n@returns(200) {data: map{window_active: bool, window_expires_at: str(date-time)?, last_user_message_at: str(date-time), window_type: str}} # Successful response with Whatsapp conversation window status\n@errors {4XX: Unexpected error}\n\n@endpoint GET /v2/whatsapp/phone_numbers/{phone_number}/conversational_components\n@desc Get phone number conversational components\n@required {phone_number: str # Phone number (E.164 format)}\n@returns(200) {data: map{record_type: str, phone_number: str, ice_breakers: [str], commands: [map]}} # Successful response with Whatsapp conversational components\n@errors {4XX: Unexpected error}\n\n@endpoint PATCH /v2/whatsapp/phone_numbers/{phone_number}/conversational_components\n@desc Update phone number conversational components\n@required {phone_number: str # Phone number (E.164 format)}\n@optional {commands: [map{command: str, description: str}] # List of commands, ice_breakers: [str] # List of ice breakers}\n@returns(200) {data: map{record_type: str, phone_number: str, ice_breakers: [str], commands: [map]}} # Successful response with Whatsapp conversational components\n@errors {4XX: Unexpected error}\n@example_request {\"commands\":[{\"command\":\"string\",\"description\":\"string\"}],\"ice_breakers\":[\"string\"]}\n\n@endpoint GET /v2/whatsapp/phone_numbers/{phone_number}/profile\n@desc Get phone number business profile\n@required {phone_number: str # Phone number (E.164 format)}\n@returns(200) {data: map{id: str, record_type: str, phone_number_id: str, display_name: str, profile_photo_url: str, category: str, about: str, description: str, email: str, website: str, address: str, profile_id: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful response with Whatsapp profile\n@errors {4XX: Unexpected error}\n\n@endpoint PATCH /v2/whatsapp/phone_numbers/{phone_number}/profile\n@desc Update phone number business profile\n@required {phone_number: str # Phone number (E.164 format)}\n@optional {display_name: str, about: str, description: str, category: str, email: str, website: str, address: str, profile_id: str(uuid) # Messaging profile ID for inbound messages}\n@returns(200) {data: map{id: str, record_type: str, phone_number_id: str, display_name: str, profile_photo_url: str, category: str, about: str, description: str, email: str, website: str, address: str, profile_id: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful response with Whatsapp profile\n@errors {4XX: Unexpected error}\n@example_request {\"display_name\":\"string\",\"about\":\"string\",\"description\":\"string\",\"category\":\"string\",\"email\":\"string\",\"website\":\"string\",\"address\":\"string\",\"profile_id\":\"3fa85f64-5717-4562-b3fc-2c963f66afa6\"}\n\n@endpoint DELETE /v2/whatsapp/phone_numbers/{phone_number}/profile/photo\n@desc Delete Whatsapp profile photo\n@required {phone_number: str # Phone number (E.164 format)}\n@returns(204) Photo deleted\n@errors {4XX: Unexpected error}\n\n@endpoint GET /v2/whatsapp/phone_numbers/{phone_number}/profile/photo\n@desc Get Whatsapp profile photo\n@required {phone_number: str # Phone number (E.164 format)}\n@returns(200) {data: map{record_type: str, phone_number_id: str, profile_photo_url: str}} # Profile photo\n@errors {4XX: Unexpected error}\n\n@endpoint POST /v2/whatsapp/phone_numbers/{phone_number}/profile/photo\n@desc Upload Whatsapp profile photo\n@required {phone_number: str # Phone number (E.164 format)}\n@returns(200) {data: map{id: str, record_type: str, phone_number_id: str, display_name: str, profile_photo_url: str, category: str, about: str, description: str, email: str, website: str, address: str, profile_id: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful response with Whatsapp profile\n@errors {4XX: Unexpected error}\n\n@endpoint POST /v2/whatsapp/phone_numbers/{phone_number}/resend_verification\n@desc Resend verification code\n@required {phone_number: str # Phone number (E.164 format)}\n@optional {verification_method: str(sms/voice)=sms}\n@returns(204) Code resent\n@errors {4XX: Unexpected error}\n@example_request {\"verification_method\":\"sms\"}\n\n@endpoint POST /v2/whatsapp/phone_numbers/{phone_number}/verify\n@desc Submit verification code for a phone number\n@required {phone_number: str # Phone number (E.164 format), code: str}\n@returns(204) Verified successfully\n@errors {4XX: Unexpected error}\n@example_request {\"code\":\"string\"}\n\n@endpoint GET /v2/whatsapp/user_data\n@desc Fetch Whatsapp user data\n@returns(200) {data: map{record_type: str, webhook_url: str(url), webhook_failover_url: str(url), created_at: str(date-time), updated_at: str(date-time)}} # Successful response with Whatsapp user data\n@errors {4XX: Unexpected error}\n\n@endpoint PATCH /v2/whatsapp/user_data\n@desc Update Whatsapp user data\n@optional {webhook_url: str(url) # URL to send Whatsapp signup events, webhook_failover_url: str(url) # Failover URL to send Whatsapp signup events}\n@returns(200) {data: map{record_type: str, webhook_url: str(url), webhook_failover_url: str(url), created_at: str(date-time), updated_at: str(date-time)}} # Successful response with Whatsapp user data\n@errors {4XX: Unexpected error}\n@example_request {\"webhook_url\":\"https://example.com\",\"webhook_failover_url\":\"https://example.com\"}\n\n@endgroup\n\n@group whatsapp_message_templates\n@endpoint DELETE /v2/whatsapp_message_templates/{id}\n@desc Delete a Whatsapp message template\n@required {id: str # Whatsapp message template ID}\n@returns(204) Deleted\n@errors {4XX: Unexpected error}\n\n@endpoint GET /v2/whatsapp_message_templates/{id}\n@desc Get a Whatsapp message template by ID\n@required {id: str # Whatsapp message template ID}\n@returns(200) {data: map{id: str, record_type: str, template_id: str, name: str, category: str, language: str, status: str, rejection_reason: str, components: [map], whatsapp_business_account: map{id: str}, created_at: str(date-time), updated_at: str(date-time)}} # Successful response with Whatsapp template\n@errors {4XX: Unexpected error}\n\n@endpoint PATCH /v2/whatsapp_message_templates/{id}\n@desc Update a Whatsapp message template\n@required {id: str # Whatsapp message template ID}\n@optional {category: str(MARKETING/UTILITY/AUTHENTICATION), components: [any] # Updated template components. Same structure as the create request.}\n@returns(200) {data: map{id: str, record_type: str, template_id: str, name: str, category: str, language: str, status: str, rejection_reason: str, components: [map], whatsapp_business_account: map{id: str}, created_at: str(date-time), updated_at: str(date-time)}} # Successful response with Whatsapp template\n@errors {4XX: Unexpected error}\n\n@endgroup\n\n@group verifications\n@endpoint GET /verifications/by_phone_number/{phone_number}\n@desc List verifications by phone number\n@required {phone_number: str # The phone number associated with the verifications to retrieve.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Expected verifications response to a valid request.\n@errors {400: Bad Request}\n\n@endpoint POST /verifications/by_phone_number/{phone_number}/actions/verify\n@desc Verify verification code by phone number\n@required {phone_number: str # The phone number associated with the verification code being verified., code: str # This is the code the user submits for verification., verify_profile_id: str(uuid) # The identifier of the associated Verify profile.}\n@returns(200) {data: map{phone_number: str, response_code: str}} # Expected verify response to a valid request.\n@errors {400: Bad Request}\n\n@endpoint POST /verifications/call\n@desc Trigger Call verification\n@required {phone_number: str # +E164 formatted phone number., verify_profile_id: str(uuid) # The identifier of the associated Verify profile.}\n@optional {custom_code: str=null # Send a self-generated numeric code to the end-user, timeout_secs: int # The number of seconds the verification code is valid for., extension: str=null # Optional extension to dial after call is answered using DTMF digits. Valid digits are 0-9, A-D, *, and #. Pauses can be added using w (0.5s) and W (1s).}\n@returns(200) {data: map{id: str(uuid), type: str, record_type: str, phone_number: str, verify_profile_id: str(uuid), custom_code: str?, timeout_secs: int, status: str, created_at: str, updated_at: str}} # Expected verifications response to a valid request.\n@errors {400: Bad Request}\n\n@endpoint POST /verifications/flashcall\n@desc Trigger Flash call verification\n@required {phone_number: str # +E164 formatted phone number., verify_profile_id: str(uuid) # The identifier of the associated Verify profile.}\n@optional {timeout_secs: int # The number of seconds the verification code is valid for.}\n@returns(200) {data: map{id: str(uuid), type: str, record_type: str, phone_number: str, verify_profile_id: str(uuid), custom_code: str?, timeout_secs: int, status: str, created_at: str, updated_at: str}} # Expected verifications response to a valid request.\n@errors {400: Bad Request}\n\n@endpoint POST /verifications/sms\n@desc Trigger SMS verification\n@required {phone_number: str # +E164 formatted phone number., verify_profile_id: str(uuid) # The identifier of the associated Verify profile.}\n@optional {custom_code: str=null # Send a self-generated numeric code to the end-user, timeout_secs: int # The number of seconds the verification code is valid for.}\n@returns(200) {data: map{id: str(uuid), type: str, record_type: str, phone_number: str, verify_profile_id: str(uuid), custom_code: str?, timeout_secs: int, status: str, created_at: str, updated_at: str}} # Expected verifications response to a valid request.\n@errors {400: Bad Request}\n\n@endpoint POST /verifications/whatsapp\n@desc Trigger WhatsApp verification\n@required {phone_number: str # +E164 formatted phone number., verify_profile_id: str(uuid) # The identifier of the associated Verify profile.}\n@optional {custom_code: str=null # Send a self-generated numeric code to the end-user, timeout_secs: int # The number of seconds the verification code is valid for.}\n@returns(200) {data: map{id: str(uuid), type: str, record_type: str, phone_number: str, verify_profile_id: str(uuid), custom_code: str?, timeout_secs: int, status: str, created_at: str, updated_at: str}} # Expected verifications response to a valid request.\n@errors {400: Bad Request}\n\n@endpoint GET /verifications/{verification_id}\n@desc Retrieve verification\n@required {verification_id: str(uuid) # The identifier of the verification to retrieve.}\n@returns(200) {data: map{id: str(uuid), type: str, record_type: str, phone_number: str, verify_profile_id: str(uuid), custom_code: str?, timeout_secs: int, status: str, created_at: str, updated_at: str}} # Expected verifications response to a valid request.\n@errors {400: Bad Request}\n\n@endpoint POST /verifications/{verification_id}/actions/verify\n@desc Verify verification code by ID\n@required {verification_id: str(uuid) # The identifier of the verification to retrieve.}\n@optional {code: str # This is the code the user submits for verification., status: str(accepted/rejected) # Identifies if the verification code has been accepted or rejected. Only permitted if custom_code was used for the verification.}\n@returns(200) {data: map{phone_number: str, response_code: str}} # Expected verify response to a valid request.\n@errors {400: Bad Request}\n\n@endgroup\n\n@group verified_numbers\n@endpoint GET /verified_numbers\n@desc List all Verified Numbers\n@optional {page: map # Consolidated page parameter (deepObject style). Use page[size] and page[number] in the query string. Originally: page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Expected response to a valid request.\n@errors {400: Bad Request, 401: Unauthorized Request, 422: Unprocessable Entity}\n\n@endpoint POST /verified_numbers\n@desc Request phone number verification\n@required {phone_number: str, verification_method: str(sms/call) # Verification method.}\n@optional {extension: str=null # Optional DTMF extension sequence to dial after the call is answered. This parameter enables verification of phone numbers behind IVR systems that require extension dialing. Valid characters: digits 0-9, letters A-D, symbols * and #. Pauses: w = 0.5 second pause, W = 1 second pause. Maximum length: 50 characters. Only works with 'call' verification method.}\n@returns(200) {phone_number: str, verification_method: str} # Expected response to a valid request.\n@errors {400: Bad Request, 401: Unauthorized Request, 422: Unprocessable Entity}\n@example_request {\"phone_number\":\"+15551234567\",\"verification_method\":\"sms\"}\n\n@endpoint DELETE /verified_numbers/{phone_number}\n@desc Delete a verified number\n@required {phone_number: str # The phone number being deleted.}\n@returns(200) {data: map{phone_number: str, record_type: str, verified_at: str}} # Expected verifications response to a valid request.\n@errors {400: Bad Request, 401: Unauthorized Request, 404: Resource Not Found}\n\n@endpoint GET /verified_numbers/{phone_number}\n@desc Retrieve a verified number\n@required {phone_number: str # The phone number being requested.}\n@returns(200) {data: map{phone_number: str, record_type: str, verified_at: str}} # Expected verifications response to a valid request.\n@errors {400: Bad Request, 401: Unauthorized Request, 404: Resource Not Found}\n\n@endpoint POST /verified_numbers/{phone_number}/actions/verify\n@desc Submit verification code\n@required {phone_number: str # The phone number being verified., verification_code: str}\n@returns(200) {data: map{phone_number: str, record_type: str, verified_at: str}} # Expected response to a valid request.\n@errors {400: Bad Request, 401: Unauthorized Request, 404: Resource Not Found, 422: Unprocessable Entity}\n\n@endgroup\n\n@group verify_profiles\n@endpoint GET /verify_profiles\n@desc List all Verify profiles\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[name], page: map # Consolidated page parameter (deepObject style). Originally: page[size], page[number]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Expected Verify profile response to a valid request.\n@errors {400: Bad Request}\n\n@endpoint POST /verify_profiles\n@desc Create a Verify profile\n@required {name: str}\n@optional {language: str, webhook_url: str, webhook_failover_url: str, sms: map{messaging_template_id: str(uuid), app_name: str, alpha_sender: str, code_length: int, whitelisted_destinations: [str], default_verification_timeout_secs: int}, call: map{messaging_template_id: str(uuid), app_name: str, code_length: int, whitelisted_destinations: [str], default_verification_timeout_secs: int}, flashcall: map{whitelisted_destinations: [str], app_name: str, default_verification_timeout_secs: int}, whatsapp: map{whitelisted_destinations: [str], default_verification_timeout_secs: int, waba_id: str, sender_phone_number: str, template_id: str}, daily_spend_limit_enabled: bool=false # Whether the daily spend limit is enforced for this verify profile., daily_spend_limit: num # The maximum daily spend allowed on this verify profile, in USD.}\n@returns(200) {data: map{id: str(uuid), name: str, webhook_url: str, webhook_failover_url: str, daily_spend_limit_enabled: bool, daily_spend_limit: num, record_type: str, created_at: str, updated_at: str, language: str, sms: map{messaging_template_id: str(uuid), app_name: str, alpha_sender: str?, code_length: int, whitelisted_destinations: [str], default_verification_timeout_secs: int}, call: map{messaging_template_id: str(uuid), app_name: str, code_length: int, whitelisted_destinations: [str], default_verification_timeout_secs: int}, flashcall: map{app_name: str, default_verification_timeout_secs: int}, whatsapp: map{messaging_template_id: str(uuid), app_name: str, code_length: int, whitelisted_destinations: [str], default_verification_timeout_secs: int, waba_id: str?, sender_phone_number: str?, template_id: str?}}} # Expected Verify profile response to a valid request.\n@errors {400: Bad Request}\n\n@endpoint GET /verify_profiles/templates\n@desc Retrieve Verify profile message templates\n@returns(200) {data: [map]} # Expected Verify profile message template response to a valid request.\n@errors {400: Bad Request, 500: Bad Request}\n\n@endpoint POST /verify_profiles/templates\n@desc Create message template\n@required {text: str # The text content of the message template.}\n@returns(200) {data: map{id: str(uuid), text: str}} # Expected message template response to a valid request.\n@errors {400: Bad Request}\n\n@endpoint PATCH /verify_profiles/templates/{template_id}\n@desc Update message template\n@required {template_id: str(uuid) # The identifier of the message template to update., text: str # The text content of the message template.}\n@returns(200) {data: map{id: str(uuid), text: str}} # Expected message template response to a valid request.\n@errors {400: Bad Request}\n\n@endpoint DELETE /verify_profiles/{verify_profile_id}\n@desc Delete Verify profile\n@required {verify_profile_id: str(uuid) # The identifier of the Verify profile to delete.}\n@returns(200) {data: map{id: str(uuid), name: str, webhook_url: str, webhook_failover_url: str, daily_spend_limit_enabled: bool, daily_spend_limit: num, record_type: str, created_at: str, updated_at: str, language: str, sms: map{messaging_template_id: str(uuid), app_name: str, alpha_sender: str?, code_length: int, whitelisted_destinations: [str], default_verification_timeout_secs: int}, call: map{messaging_template_id: str(uuid), app_name: str, code_length: int, whitelisted_destinations: [str], default_verification_timeout_secs: int}, flashcall: map{app_name: str, default_verification_timeout_secs: int}, whatsapp: map{messaging_template_id: str(uuid), app_name: str, code_length: int, whitelisted_destinations: [str], default_verification_timeout_secs: int, waba_id: str?, sender_phone_number: str?, template_id: str?}}} # Expected Verify profile response to a valid request.\n@errors {400: Bad Request}\n\n@endpoint GET /verify_profiles/{verify_profile_id}\n@desc Retrieve Verify profile\n@required {verify_profile_id: str(uuid) # The identifier of the Verify profile to retrieve.}\n@returns(200) {data: map{id: str(uuid), name: str, webhook_url: str, webhook_failover_url: str, daily_spend_limit_enabled: bool, daily_spend_limit: num, record_type: str, created_at: str, updated_at: str, language: str, sms: map{messaging_template_id: str(uuid), app_name: str, alpha_sender: str?, code_length: int, whitelisted_destinations: [str], default_verification_timeout_secs: int}, call: map{messaging_template_id: str(uuid), app_name: str, code_length: int, whitelisted_destinations: [str], default_verification_timeout_secs: int}, flashcall: map{app_name: str, default_verification_timeout_secs: int}, whatsapp: map{messaging_template_id: str(uuid), app_name: str, code_length: int, whitelisted_destinations: [str], default_verification_timeout_secs: int, waba_id: str?, sender_phone_number: str?, template_id: str?}}} # Expected Verify profile response to a valid request.\n@errors {400: Bad Request}\n\n@endpoint PATCH /verify_profiles/{verify_profile_id}\n@desc Update Verify profile\n@required {verify_profile_id: str(uuid) # The identifier of the Verify profile to update.}\n@optional {name: str, webhook_url: str, webhook_failover_url: str, sms: map{messaging_template_id: str(uuid), app_name: str, alpha_sender: str, code_length: int, whitelisted_destinations: [str], default_verification_timeout_secs: int}, call: map{messaging_template_id: str(uuid), app_name: str, code_length: int, whitelisted_destinations: [str], default_verification_timeout_secs: int}, whatsapp: map{whitelisted_destinations: [str], default_verification_timeout_secs: int, waba_id: str, sender_phone_number: str, template_id: str}, language: str, daily_spend_limit_enabled: bool # Whether the daily spend limit is enforced for this verify profile., daily_spend_limit: num # The maximum daily spend allowed on this verify profile, in USD.}\n@returns(200) {data: map{id: str(uuid), name: str, webhook_url: str, webhook_failover_url: str, daily_spend_limit_enabled: bool, daily_spend_limit: num, record_type: str, created_at: str, updated_at: str, language: str, sms: map{messaging_template_id: str(uuid), app_name: str, alpha_sender: str?, code_length: int, whitelisted_destinations: [str], default_verification_timeout_secs: int}, call: map{messaging_template_id: str(uuid), app_name: str, code_length: int, whitelisted_destinations: [str], default_verification_timeout_secs: int}, flashcall: map{app_name: str, default_verification_timeout_secs: int}, whatsapp: map{messaging_template_id: str(uuid), app_name: str, code_length: int, whitelisted_destinations: [str], default_verification_timeout_secs: int, waba_id: str?, sender_phone_number: str?, template_id: str?}}} # Expected Verify profile response to a valid request.\n@errors {400: Bad Request}\n\n@endgroup\n\n@group virtual_cross_connects\n@endpoint GET /virtual_cross_connects\n@desc List all Virtual Cross Connects\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[network_id], page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [any], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint POST /virtual_cross_connects\n@desc Create a Virtual Cross Connect\n@returns(200) {data: any} # Successful response\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint GET /virtual_cross_connects/coverage\n@desc List Virtual Cross Connect Cloud Coverage\n@optional {filters: map # Consolidated filters parameter (deepObject style). Originally: filters[available_bandwidth][contains], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[cloud_provider], filter[cloud_provider_region], filter[location.region], filter[location.site], filter[location.pop], filter[location.code], page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [any], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint DELETE /virtual_cross_connects/{id}\n@desc Delete a Virtual Cross Connect\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint GET /virtual_cross_connects/{id}\n@desc Retrieve a Virtual Cross Connect\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint PATCH /virtual_cross_connects/{id}\n@desc Update the Virtual Cross Connect\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endgroup\n\n@group virtual_cross_connects_coverage\n@endpoint GET /virtual_cross_connects_coverage\n@desc List Virtual Cross Connect Cloud Coverage\n@optional {filters: map # Consolidated filters parameter (deepObject style). Originally: filters[available_bandwidth][contains], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[cloud_provider], filter[cloud_provider_region], filter[location.region], filter[location.site], filter[location.pop], filter[location.code], page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [any], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unexpected error}\n\n@endgroup\n\n@group voice_clones\n@endpoint GET /voice_clones\n@desc List voice clones\n@optional {page[number]: int=1: any # Page number for pagination (1-based)., page[size]: int=20 # Number of results per page., filter[name]: str # Case-insensitive substring filter on the name field., filter[provider]: str(telnyx/minimax/Telnyx/Minimax) # Filter by voice synthesis provider. Case-insensitive., sort: str(name/-name/created_at/-created_at)=-created_at # Sort order. Prefix with `-` for descending. Defaults to `-created_at`.}\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_results: int, total_pages: int}} # A paginated list of voice clones.\n@errors {401: Unauthorized — missing or invalid bearer token.}\n\n@endpoint POST /voice_clones\n@desc Create a voice clone from a voice design\n@returns(201) {data: map{record_type: str, id: str(uuid), source_voice_design_id: str(uuid)?, source_voice_design_version: int?, name: str, language: str?, gender: str?, label: str?, created_at: str(date-time), updated_at: str(date-time), provider: str, provider_supported_models: [str], provider_voice_id: str?, model_id: str, status: str}} # Voice clone created successfully.\n@errors {401: Unauthorized — missing or invalid bearer token., 404: Voice design not found., 422: Unprocessable entity — validation error in the request body., 502: Bad gateway — upstream voice cloning service is unavailable.}\n\n@endpoint POST /voice_clones/from_upload\n@desc Create a voice clone from an audio file upload\n@returns(201) {data: map{record_type: str, id: str(uuid), source_voice_design_id: str(uuid)?, source_voice_design_version: int?, name: str, language: str?, gender: str?, label: str?, created_at: str(date-time), updated_at: str(date-time), provider: str, provider_supported_models: [str], provider_voice_id: str?, model_id: str, status: str}} # Voice clone created successfully from the uploaded audio.\n@returns(202) {data: map{record_type: str, id: str(uuid), source_voice_design_id: str(uuid)?, source_voice_design_version: int?, name: str, language: str?, gender: str?, label: str?, created_at: str(date-time), updated_at: str(date-time), provider: str, provider_supported_models: [str], provider_voice_id: str?, model_id: str, status: str}} # Voice clone accepted — on-prem import in progress (Ultra model). Poll GET /voice_clones/{id} to check status.\n@errors {400: Bad request — the audio file is invalid, unsupported, or exceeds the size limit., 401: Unauthorized — missing or invalid bearer token., 422: Unprocessable entity — validation error in the request body., 502: Bad gateway — upstream voice cloning service is unavailable.}\n\n@endpoint DELETE /voice_clones/{id}\n@desc Delete a voice clone\n@required {id: str(uuid) # The voice clone UUID.}\n@returns(204) Voice clone deleted successfully.\n@errors {401: Unauthorized — missing or invalid bearer token., 404: Voice clone not found.}\n\n@endpoint PATCH /voice_clones/{id}\n@desc Update a voice clone\n@required {id: str(uuid) # The voice clone UUID., name: str # New name for the voice clone.}\n@optional {language: str # Updated ISO 639-1 language code or `auto`., gender: str(male/female/neutral) # Updated gender for the voice clone.}\n@returns(200) {data: map{record_type: str, id: str(uuid), source_voice_design_id: str(uuid)?, source_voice_design_version: int?, name: str, language: str?, gender: str?, label: str?, created_at: str(date-time), updated_at: str(date-time), provider: str, provider_supported_models: [str], provider_voice_id: str?, model_id: str, status: str}} # Voice clone updated successfully.\n@errors {401: Unauthorized — missing or invalid bearer token., 404: Voice clone not found., 422: Unprocessable entity — validation error in the request body.}\n\n@endpoint GET /voice_clones/{id}/sample\n@desc Download voice clone audio sample\n@required {id: str(uuid) # The voice clone UUID.}\n@returns(200) WAV audio sample binary.\n@errors {401: Unauthorized — missing or invalid bearer token., 404: Voice clone not found.}\n\n@endgroup\n\n@group voice_designs\n@endpoint GET /voice_designs\n@desc List voice designs\n@optional {page[number]: int=1: any # Page number for pagination (1-based)., page[size]: int=20 # Number of results per page., filter[name]: str # Case-insensitive substring filter on the name field., sort: str(name/-name/created_at/-created_at)=-created_at # Sort order. Prefix with `-` for descending. Defaults to `-created_at`.}\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_results: int, total_pages: int}} # A paginated list of voice designs.\n@errors {401: Unauthorized — missing or invalid bearer token.}\n\n@endpoint POST /voice_designs\n@desc Create or add a version to a voice design\n@required {text: str # Sample text to synthesize for this voice design., prompt: str # Natural language description of the voice style, e.g. 'Speak in a warm, friendly tone with a slight British accent'.}\n@optional {name: str # Name for the voice design. Required when creating a new design (`voice_design_id` is not provided); ignored when adding a version. Cannot be a UUID., voice_design_id: str(uuid) # ID of an existing voice design to add a new version to. When provided, a new version is created instead of a new design., language: str=Auto # Language for synthesis. Supported values: Auto, Chinese, English, Japanese, Korean, German, French, Russian, Portuguese, Spanish, Italian. Defaults to Auto., temperature: num(float) # Sampling temperature controlling randomness. Higher values produce more varied output. Default: 0.9., top_k: int # Top-k sampling parameter — limits the token vocabulary considered at each step. Default: 50., top_p: num(float) # Top-p (nucleus) sampling parameter — cumulative probability cutoff for token selection. Default: 1.0., repetition_penalty: num(float) # Repetition penalty to reduce repeated patterns in generated audio. Default: 1.05., max_new_tokens: int # Maximum number of tokens to generate. Default: 2048., provider: str(telnyx/minimax/Telnyx/Minimax)=telnyx # Voice synthesis provider. `telnyx` uses the Qwen3TTS model; `minimax` uses the Minimax speech models. Case-insensitive. Defaults to `telnyx`.}\n@returns(201) {data: map{record_type: str, id: str(uuid), name: str, version: int, text: str, prompt: str, voice_sample_size: int, version_created_at: str(date-time), created_at: str(date-time), updated_at: str(date-time), provider: str?, provider_supported_models: [str], provider_voice_id: str?}} # Voice design created or new version added successfully.\n@errors {401: Unauthorized — missing or invalid bearer token., 404: Voice design not found — the specified `voice_design_id` does not exist., 409: Conflict — the voice design has reached the maximum of 50 versions., 422: Unprocessable entity — validation error in the request body., 502: Bad gateway — upstream voice synthesis service is unavailable.}\n\n@endpoint DELETE /voice_designs/{id}\n@desc Delete a voice design\n@required {id: str # The voice design UUID or name.}\n@returns(204) Voice design deleted successfully.\n@errors {401: Unauthorized — missing or invalid bearer token., 404: Voice design not found.}\n\n@endpoint GET /voice_designs/{id}\n@desc Get a voice design\n@required {id: str # The voice design UUID or name.}\n@optional {version: int # Specific version number to retrieve. Defaults to the latest version.}\n@returns(200) {data: map{record_type: str, id: str(uuid), name: str, version: int, text: str, prompt: str, voice_sample_size: int, version_created_at: str(date-time), created_at: str(date-time), updated_at: str(date-time), provider: str?, provider_supported_models: [str], provider_voice_id: str?}} # The requested voice design.\n@errors {401: Unauthorized — missing or invalid bearer token., 404: Voice design not found.}\n\n@endpoint PATCH /voice_designs/{id}\n@desc Rename a voice design\n@required {id: str # The voice design UUID or name., name: str # New name for the voice design.}\n@returns(200) {data: map{record_type: str, id: str(uuid), name: str, created_at: str(date-time), updated_at: str(date-time), provider: str?, provider_supported_models: [str]}} # Voice design renamed successfully.\n@errors {401: Unauthorized — missing or invalid bearer token., 404: Voice design not found., 422: Unprocessable entity — validation error in the request body.}\n\n@endpoint GET /voice_designs/{id}/sample\n@desc Download voice design audio sample\n@required {id: str # The voice design UUID or name.}\n@optional {version: int # Specific version number to download the sample for. Defaults to the latest version.}\n@returns(200) WAV audio sample binary.\n@errors {401: Unauthorized — missing or invalid bearer token., 404: Voice design or version not found.}\n\n@endpoint DELETE /voice_designs/{id}/versions/{version}\n@desc Delete a specific version of a voice design\n@required {id: str # The voice design UUID or name., version: int # The version number to delete.}\n@returns(204) Voice design version deleted successfully.\n@errors {400: Bad request — invalid version number., 401: Unauthorized — missing or invalid bearer token., 404: Voice design or version not found.}\n\n@endgroup\n\n@group voice_sdk_call_reports\n@endpoint GET /voice_sdk_call_reports\n@desc List Voice SDK call reports\n@optional {page: map # Consolidated page parameter (deepObject style)., sort: str(asc/desc/created_at/-created_at)=desc # Set the order of the results by creation date. `asc` and `created_at` sort oldest reports first; `desc` and `-created_at` sort newest reports first. If not given, results are sorted by creation date in descending order.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Paginated raw call report stats payloads.\n@errors {400: Bad request — invalid pagination or sort parameter., 401: Authentication failed., 500: Unexpected server error while listing reports.}\n\n@endpoint GET /voice_sdk_call_reports/{call_id}\n@desc Retrieve Voice SDK call reports by call ID\n@required {call_id: str(uuid) # Call identifier used to retrieve reports owned by the authenticated user.}\n@returns(200) Raw call report stats payloads.\n@errors {400: Bad request — invalid path parameter., 401: Authentication failed., 404: No call report was found for the authenticated user and call ID., 500: Unexpected server error while looking up the report.}\n\n@endgroup\n\n@group web_search\n@endpoint POST /web_search\n@desc Web search\n@required {query: str # The search query text.}\n@optional {count: int # Number of results to return (1-100)., country: str # Two-letter country code (ISO 3166-1 alpha-2) to bias results., safesearch: str(off/moderate/strict) # Safe search filter level., freshness: str # Time-based filter for results. Common values: `day`, `week`, `month`, `year`., include_domains: [str] # Restrict results to these domains (bare hostnames, e.g. `arxiv.org`)., exclude_domains: [str] # Exclude results from these domains (bare hostnames, e.g. `pinterest.com`)., livecrawl: bool # When true, the provider crawls pages in real-time for fresh content. The boolean is translated to the provider's internal enum internally; callers always pass `true` or `false`.}\n@returns(200) {data: map{results: map{web: [map], news: [map]}}} # Successful search response.\n@errors {400: Invalid request — validation error or invalid parameters., 401: Unauthorized — missing or invalid API key.  The API Gateway returns this response before the request reaches the backend service. The error format follows the standard Telnyx JSON:API error envelope with `errors[]`, not the backend-level `WebSearchError` shape., 500: Internal server error., 502: The upstream search provider returned an error., 504: The upstream search provider timed out.}\n@example_request {\"query\":\"latest AI agent frameworks\",\"count\":10,\"country\":\"US\",\"safesearch\":\"moderate\",\"freshness\":\"week\",\"include_domains\":[\"arxiv.org\",\"github.com\"],\"livecrawl\":false}\n\n@endpoint POST /web_search/contents\n@desc Retrieve page contents\n@required {urls: [str(uri)] # List of URLs to retrieve content from (max 20 for public API).}\n@optional {formats: [str] # Content formats to return. If omitted, `html` and `metadata` are returned by default. Retrieval is best-effort per URL: a format field appears only when that content could be produced, and a freshly crawled page may also include `html` even when not requested., crawl_timeout: int # Timeout for crawling each URL, in seconds (1-60)., max_age: int # Maximum age of cached content in seconds. `null` means no limit.}\n@returns(200) {data: map{results: [map]}} # Successful content retrieval response.\n@errors {400: Invalid request — validation error or invalid parameters., 401: Unauthorized — missing or invalid API key.  The API Gateway returns this response before the request reaches the backend service. The error format follows the standard Telnyx JSON:API error envelope with `errors[]`, not the backend-level `WebSearchError` shape., 500: Internal server error., 502: The upstream search provider returned an error., 504: The upstream search provider timed out.}\n@example_request {\"urls\":[\"https://en.wikipedia.org/wiki/Artificial_intelligence\"],\"formats\":[\"markdown\",\"metadata\"],\"crawl_timeout\":10,\"max_age\":null}\n\n@endpoint POST /web_search/research\n@desc Start research task\n@required {query: str # The research question or topic.}\n@optional {research_effort: str(lite/standard/deep) # Research depth level. `lite` is fastest, `deep` is most thorough., max_sources: int # Maximum number of sources to use., background: bool # When `true`, the research runs asynchronously. The response returns a `task_id` immediately instead of waiting for the result. Poll `GET /web_search/research/{task_id}` to check status.}\n@returns(200) {data: any} # Research response. Shape depends on `background`:  - **Synchronous** (`background` false/unset): returns `answer` + `citations`. - **Asynchronous** (`background` true): returns `task_id` + `status`.\n@errors {400: Invalid request — validation error or invalid parameters., 401: Unauthorized — missing or invalid API key.  The API Gateway returns this response before the request reaches the backend service. The error format follows the standard Telnyx JSON:API error envelope with `errors[]`, not the backend-level `WebSearchError` shape., 500: Internal server error., 502: The upstream search provider returned an error., 504: The upstream search provider timed out.}\n@example_request {\"query\":\"Compare the performance of RAG vs fine-tuning for domain-specific QA\",\"research_effort\":\"standard\",\"max_sources\":20,\"background\":false}\n\n@endpoint GET /web_search/research/{task_id}\n@desc Get research task status\n@required {task_id: str # The research task ID returned by `POST /web_search/research` with `background: true`.}\n@returns(200) {data: map{task_id: str, status: str, answer: str, citations: [map], error: str?}} # Research task status.\n@errors {401: Unauthorized — missing or invalid API key.  The API Gateway returns this response before the request reaches the backend service. The error format follows the standard Telnyx JSON:API error envelope with `errors[]`, not the backend-level `WebSearchError` shape., 404: Research task not found. Returned for unknown, malformed, expired, or already-purged task IDs., 500: Internal server error., 502: The upstream search provider returned an error.}\n\n@endgroup\n\n@group webhook_deliveries\n@endpoint GET /webhook_deliveries\n@desc List webhook deliveries\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size], filter: map # Consolidated filter parameter (deepObject style). Originally: filter[status][eq], filter[event_type], filter[webhook][contains], filter[attempts][contains], filter[started_at][gte], filter[started_at][lte], filter[finished_at][gte], filter[finished_at][lte]}\n@returns(200) {data: [any], meta: map{page_number: int, page_size: int, total_pages: int, total_results: int}} # A paginated array of webhook_delivery attempts\n@errors {401: Unauthorized, 422: Unprocessable entity}\n\n@endpoint GET /webhook_deliveries/{id}\n@desc Find webhook_delivery details by ID\n@required {id: str(uuid) # Uniquely identifies the webhook_delivery.}\n@returns(200) {data: any} # Webhook delivery record.\n@errors {401: Unauthorized, 404: WebhookDelivery not found}\n\n@endgroup\n\n@group whatsapp\n@endpoint GET /whatsapp/business_accounts\n@desc List Whatsapp Business Accounts\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with list of Whatsapp business accounts\n@errors {4XX: Unexpected error}\n\n@endpoint DELETE /whatsapp/business_accounts/{id}\n@desc Delete a Whatsapp Business Account\n@required {id: str # Whatsapp Business Account ID}\n@returns(204) Deleted\n@errors {4XX: Unexpected error}\n\n@endpoint GET /whatsapp/business_accounts/{id}\n@desc Get a single Whatsapp Business Account\n@required {id: str # Whatsapp Business Account ID}\n@returns(200) {data: map{id: str(uuid), record_type: str, name: str, waba_id: str, status: str, phone_numbers_count: int, business_verification_status: str, account_review_status: str, country: str, created_at: str(date-time)}} # Successful response with Whatsapp business account\n@errors {4XX: Unexpected error}\n\n@endpoint GET /whatsapp/business_accounts/{id}/phone_numbers\n@desc List phone numbers for a WABA\n@required {id: str # Whatsapp Business Account ID}\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with Whatsapp phone numbers\n@errors {4XX: Unexpected error}\n\n@endpoint POST /whatsapp/business_accounts/{id}/phone_numbers\n@desc Initialize Whatsapp phone number verification\n@required {id: str # Whatsapp Business Account ID, phone_number: str, display_name: str}\n@optional {verification_method: str(sms/voice)=sms, language: str=en_US}\n@returns(204) Verification initiated\n@errors {4XX: Unexpected error}\n@example_request {\"phone_number\":\"string\",\"display_name\":\"string\",\"verification_method\":\"sms\",\"language\":\"en_US\"}\n\n@endpoint GET /whatsapp/business_accounts/{id}/settings\n@desc Get WABA settings\n@required {id: str # Whatsapp Business Account ID}\n@returns(200) {data: map{id: str(uuid), record_type: str, name: str, timezone: str, webhook_url: str(url), webhook_failover_url: str(url), webhook_enabled: bool, webhook_events: [str], updated_at: str(date-time)}} # Successful response with Whatsapp business account settings\n@errors {4XX: Unexpected error}\n\n@endpoint PATCH /whatsapp/business_accounts/{id}/settings\n@desc Update WABA settings\n@required {id: str # Whatsapp Business Account ID}\n@optional {name: str, timezone: str # IANA timezone identifier, webhook_url: str(url) # URL to send Whatsapp events, webhook_failover_url: str(url) # Failover URL to send Whatsapp events, webhook_enabled: bool # Enable/disable receiving Whatsapp events, webhook_events: [str]}\n@returns(200) {data: map{id: str(uuid), record_type: str, name: str, timezone: str, webhook_url: str(url), webhook_failover_url: str(url), webhook_enabled: bool, webhook_events: [str], updated_at: str(date-time)}} # Successful response with Whatsapp business account settings\n@errors {4XX: Unexpected error}\n\n@endpoint GET /whatsapp/message_templates\n@desc List Whatsapp message templates\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size], filter[waba_id]: str # Filter by WABA ID, filter[category]: str(MARKETING/UTILITY/AUTHENTICATION) # Filter by category, filter[status]: str # Filter by template status, filter[search]: str # Search templates by name}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with Whatsapp template\n@errors {4XX: Unexpected error}\n\n@endpoint POST /whatsapp/message_templates\n@desc Create a Whatsapp message template\n@required {waba_id: str # The WhatsApp Business Account ID., name: str # Template name. Lowercase letters, numbers, and underscores only., category: str(MARKETING/UTILITY/AUTHENTICATION) # Template category: AUTHENTICATION, UTILITY, or MARKETING., language: str # Template language code (e.g. en_US, es, pt_BR)., components: [any] # Template components defining message structure. Passed through to Meta Graph API. Templates with variables must include example values. Supports HEADER, BODY, FOOTER, BUTTONS, CAROUSEL and any future Meta component types.}\n@returns(201) {data: map{id: str, record_type: str, template_id: str, name: str, category: str, language: str, status: str, rejection_reason: str, components: [map], whatsapp_business_account: map{id: str}, created_at: str(date-time), updated_at: str(date-time)}} # Successful response with Whatsapp template\n@errors {4XX: Unexpected error}\n\n@endpoint DELETE /whatsapp/message_templates/{id}\n@desc Delete a Whatsapp message template\n@required {id: str # Whatsapp message template ID}\n@returns(204) Deleted\n@errors {4XX: Unexpected error}\n\n@endpoint GET /whatsapp/message_templates/{id}\n@desc Get a Whatsapp message template by ID\n@required {id: str # Whatsapp message template ID}\n@returns(200) {data: map{id: str, record_type: str, template_id: str, name: str, category: str, language: str, status: str, rejection_reason: str, components: [map], whatsapp_business_account: map{id: str}, created_at: str(date-time), updated_at: str(date-time)}} # Successful response with Whatsapp template\n@errors {4XX: Unexpected error}\n\n@endpoint PATCH /whatsapp/message_templates/{id}\n@desc Update a Whatsapp message template\n@required {id: str # Whatsapp message template ID}\n@optional {category: str(MARKETING/UTILITY/AUTHENTICATION), components: [any] # Updated template components. Same structure as the create request.}\n@returns(200) {data: map{id: str, record_type: str, template_id: str, name: str, category: str, language: str, status: str, rejection_reason: str, components: [map], whatsapp_business_account: map{id: str}, created_at: str(date-time), updated_at: str(date-time)}} # Successful response with Whatsapp template\n@errors {4XX: Unexpected error}\n\n@endpoint GET /whatsapp/phone_numbers\n@desc List Whatsapp phone numbers\n@optional {page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response with Whatsapp phone numbers\n@errors {4XX: Unexpected error}\n\n@endpoint DELETE /whatsapp/phone_numbers/{phone_number}\n@desc Delete a Whatsapp phone number\n@required {phone_number: str # Phone number (E.164 format)}\n@returns(204) Phone number was successfully deleted\n@errors {4XX: Unexpected error}\n\n@endpoint GET /whatsapp/phone_numbers/{phone_number}\n@desc Retrieve a WhatsApp phone number\n@required {phone_number: str # Phone number (E.164 format)}\n@returns(200) {data: map{record_type: str, phone_number: str, phone_number_id: str, waba_id: str, user_id: str, display_name: str, quality_rating: str, status: str, created_at: str(date-time), enabled: bool, calling_enabled: bool, is_on_biz_app: bool, coexistence_state: str?, sync_deadline: str(date-time)?, sync_progress: map?}} # Successful response with one WhatsApp phone number\n@errors {4XX: Unexpected error}\n\n@endpoint GET /whatsapp/phone_numbers/{phone_number}/calling_settings\n@desc Get calling settings for a phone number\n@required {phone_number: str # Phone number (E.164 format)}\n@returns(200) {data: map{record_type: str, phone_number: str, updated_at: str(date-time), enabled: bool}} # Successful response with Whatsapp calling settings\n@errors {4XX: Unexpected error}\n\n@endpoint PATCH /whatsapp/phone_numbers/{phone_number}/calling_settings\n@desc Enable or disable Whatsapp calling for a phone number\n@required {phone_number: str # Phone number (E.164 format), enabled: bool}\n@returns(200) {data: map{record_type: str, phone_number: str, updated_at: str(date-time), enabled: bool}} # Successful response with Whatsapp calling settings\n@errors {4XX: Unexpected error}\n@example_request {\"enabled\":false}\n\n@endpoint GET /whatsapp/phone_numbers/{phone_number}/conversation_window\n@desc Get conversation window status for a phone number\n@required {phone_number: str # Phone number (E.164 format), destination_number: str # Destination phone number in E.164 format}\n@returns(200) {data: map{window_active: bool, window_expires_at: str(date-time)?, last_user_message_at: str(date-time), window_type: str}} # Successful response with Whatsapp conversation window status\n@errors {4XX: Unexpected error}\n\n@endpoint GET /whatsapp/phone_numbers/{phone_number}/conversational_components\n@desc Get phone number conversational components\n@required {phone_number: str # Phone number (E.164 format)}\n@returns(200) {data: map{record_type: str, phone_number: str, ice_breakers: [str], commands: [map]}} # Successful response with Whatsapp conversational components\n@errors {4XX: Unexpected error}\n\n@endpoint PATCH /whatsapp/phone_numbers/{phone_number}/conversational_components\n@desc Update phone number conversational components\n@required {phone_number: str # Phone number (E.164 format)}\n@optional {commands: [map{command: str, description: str}] # List of commands, ice_breakers: [str] # List of ice breakers}\n@returns(200) {data: map{record_type: str, phone_number: str, ice_breakers: [str], commands: [map]}} # Successful response with Whatsapp conversational components\n@errors {4XX: Unexpected error}\n@example_request {\"commands\":[{\"command\":\"string\",\"description\":\"string\"}],\"ice_breakers\":[\"string\"]}\n\n@endpoint GET /whatsapp/phone_numbers/{phone_number}/profile\n@desc Get phone number business profile\n@required {phone_number: str # Phone number (E.164 format)}\n@returns(200) {data: map{id: str, record_type: str, phone_number_id: str, display_name: str, profile_photo_url: str, category: str, about: str, description: str, email: str, website: str, address: str, profile_id: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful response with Whatsapp profile\n@errors {4XX: Unexpected error}\n\n@endpoint PATCH /whatsapp/phone_numbers/{phone_number}/profile\n@desc Update phone number business profile\n@required {phone_number: str # Phone number (E.164 format)}\n@optional {display_name: str, about: str, description: str, category: str, email: str, website: str, address: str, profile_id: str(uuid) # Messaging profile ID for inbound messages}\n@returns(200) {data: map{id: str, record_type: str, phone_number_id: str, display_name: str, profile_photo_url: str, category: str, about: str, description: str, email: str, website: str, address: str, profile_id: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful response with Whatsapp profile\n@errors {4XX: Unexpected error}\n@example_request {\"display_name\":\"string\",\"about\":\"string\",\"description\":\"string\",\"category\":\"string\",\"email\":\"string\",\"website\":\"string\",\"address\":\"string\",\"profile_id\":\"3fa85f64-5717-4562-b3fc-2c963f66afa6\"}\n\n@endpoint DELETE /whatsapp/phone_numbers/{phone_number}/profile/photo\n@desc Delete Whatsapp profile photo\n@required {phone_number: str # Phone number (E.164 format)}\n@returns(204) Photo deleted\n@errors {4XX: Unexpected error}\n\n@endpoint GET /whatsapp/phone_numbers/{phone_number}/profile/photo\n@desc Get Whatsapp profile photo\n@required {phone_number: str # Phone number (E.164 format)}\n@returns(200) {data: map{record_type: str, phone_number_id: str, profile_photo_url: str}} # Profile photo\n@errors {4XX: Unexpected error}\n\n@endpoint POST /whatsapp/phone_numbers/{phone_number}/profile/photo\n@desc Upload Whatsapp profile photo\n@required {phone_number: str # Phone number (E.164 format)}\n@returns(200) {data: map{id: str, record_type: str, phone_number_id: str, display_name: str, profile_photo_url: str, category: str, about: str, description: str, email: str, website: str, address: str, profile_id: str, created_at: str(date-time), updated_at: str(date-time)}} # Successful response with Whatsapp profile\n@errors {4XX: Unexpected error}\n\n@endpoint POST /whatsapp/phone_numbers/{phone_number}/resend_verification\n@desc Resend verification code\n@required {phone_number: str # Phone number (E.164 format)}\n@optional {verification_method: str(sms/voice)=sms}\n@returns(204) Code resent\n@errors {4XX: Unexpected error}\n@example_request {\"verification_method\":\"sms\"}\n\n@endpoint POST /whatsapp/phone_numbers/{phone_number}/verify\n@desc Submit verification code for a phone number\n@required {phone_number: str # Phone number (E.164 format), code: str}\n@returns(204) Verified successfully\n@errors {4XX: Unexpected error}\n@example_request {\"code\":\"string\"}\n\n@endgroup\n\n@group wireguard_interfaces\n@endpoint GET /wireguard_interfaces\n@desc List all WireGuard Interfaces\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[network_id], page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [any], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint POST /wireguard_interfaces\n@desc Create a WireGuard Interface\n@returns(202) {data: any} # Creation request accepted. Provisioning is asynchronous; poll GET /wireguard_interfaces/{id} with the returned id to check status.\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint DELETE /wireguard_interfaces/{id}\n@desc Delete a WireGuard Interface\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint GET /wireguard_interfaces/{id}\n@desc Retrieve a WireGuard Interfaces\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unexpected error}\n\n@endgroup\n\n@group wireguard_peers\n@endpoint GET /wireguard_peers\n@desc List all WireGuard Peers\n@optional {filter: map # Consolidated filter parameter (deepObject style). Originally: filter[wireguard_interface_id], page: map # Consolidated page parameter (deepObject style). Originally: page[number], page[size]}\n@returns(200) {data: [any], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint POST /wireguard_peers\n@desc Create a WireGuard Peer\n@returns(202) {data: any} # Creation request accepted. Provisioning is asynchronous; poll GET /wireguard_peers/{id} with the returned id to check status.\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint DELETE /wireguard_peers/{id}\n@desc Delete the WireGuard Peer\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint GET /wireguard_peers/{id}\n@desc Retrieve the WireGuard Peer\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unexpected error}\n\n@endpoint PATCH /wireguard_peers/{id}\n@desc Update the WireGuard Peer\n@required {id: str(uuid) # Identifies the resource.}\n@optional {public_key: str # The WireGuard `PublicKey`.If you do not provide a Public Key, a new Public and Private key pair will be generated for you.}\n@returns(200) {data: any} # Successful response\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint GET /wireguard_peers/{id}/config\n@desc Retrieve Wireguard config template for Peer\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) Successful response\n@errors {422: Unexpected error}\n\n@endgroup\n\n@group wireless\n@endpoint GET /wireless/detail/records/reports\n@desc Get all Wireless Detail Records (WDRs) Reports\n@optional {page[number]: int=1: any # The page number to load., page[size]: int=20 # The size of the page.}\n@returns(200) {data: [map]} # Successful response\n@errors {401: Unauthorized}\n\n@endpoint POST /wireless/detail/records/reports\n@desc Create a Wireless Detail Records (WDRs) Report\n@optional {start_time: str # ISO 8601 formatted date-time indicating the start time., end_time: str # ISO 8601 formatted date-time indicating the end time.}\n@returns(201) {data: map{id: str(uuid), record_type: str, created_at: str, updated_at: str, start_time: str, end_time: str, status: str, report_url: str}} # Successful response\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint DELETE /wireless/detail/records/reports/{id}\n@desc Delete a Wireless Detail Record (WDR) Report\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: map{id: str(uuid), record_type: str, created_at: str, updated_at: str, start_time: str, end_time: str, status: str, report_url: str}} # Successful response\n@errors {404: Resource not found}\n\n@endpoint GET /wireless/detail/records/reports/{id}\n@desc Get a Wireless Detail Record (WDR) Report\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: map{id: str(uuid), record_type: str, created_at: str, updated_at: str, start_time: str, end_time: str, status: str, report_url: str}} # Successful response\n@errors {404: Resource not found}\n\n@endpoint GET /wireless/detail_records_reports\n@desc Get all Wireless Detail Records (WDRs) Reports\n@optional {page[number]: int=1: any # The page number to load., page[size]: int=20 # The size of the page.}\n@returns(200) {data: [map]} # Successful response\n@errors {401: Unauthorized}\n\n@endpoint POST /wireless/detail_records_reports\n@desc Create a Wireless Detail Records (WDRs) Report\n@optional {start_time: str # ISO 8601 formatted date-time indicating the start time., end_time: str # ISO 8601 formatted date-time indicating the end time.}\n@returns(201) {data: map{id: str(uuid), record_type: str, created_at: str, updated_at: str, start_time: str, end_time: str, status: str, report_url: str}} # Successful response\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint DELETE /wireless/detail_records_reports/{id}\n@desc Delete a Wireless Detail Record (WDR) Report\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: map{id: str(uuid), record_type: str, created_at: str, updated_at: str, start_time: str, end_time: str, status: str, report_url: str}} # Successful response\n@errors {404: Resource not found}\n\n@endpoint GET /wireless/detail_records_reports/{id}\n@desc Get a Wireless Detail Record (WDR) Report\n@required {id: str(uuid) # Identifies the resource.}\n@returns(200) {data: map{id: str(uuid), record_type: str, created_at: str, updated_at: str, start_time: str, end_time: str, status: str, report_url: str}} # Successful response\n@errors {404: Resource not found}\n\n@endpoint GET /wireless/regions\n@desc Get all wireless regions\n@required {product: str # The product for which to list regions (e.g., 'public_ips', 'private_wireless_gateways').}\n@returns(200) {data: [map]} # A list of wireless regions\n@errors {404: Resource not found}\n\n@endgroup\n\n@group wireless_blocklist_values\n@endpoint GET /wireless_blocklist_values\n@desc Get all possible wireless blocklist values\n@required {type: str(country/mcc/plmn) # The Wireless Blocklist type for which to list possible values (e.g., `country`, `mcc`, `plmn`).}\n@returns(200) {data: any} # A list of possible wireless blocklist values\n@errors {422: Missing or invalid blocklist type}\n\n@endgroup\n\n@group wireless_blocklists\n@endpoint GET /wireless_blocklists\n@desc Get all Wireless Blocklists\n@optional {page[number]: int=1: any # The page number to load., page[size]: int=20 # The size of the page., filter[name]: str # The name of the Wireless Blocklist., filter[type]: str # When the Private Wireless Gateway was last updated.}\n@returns(200) {data: [map], meta: map{total_pages: int, total_results: int, page_number: int, page_size: int}} # Successful Response\n@errors {401: Unauthorized}\n\n@endpoint POST /wireless_blocklists\n@desc Create a Wireless Blocklist\n@required {name: str # The name of the Wireless Blocklist., type: str(country/mcc/plmn) # The type of wireless blocklist., values: [any] # Values to block. The values here depend on the `type` of Wireless Blocklist.}\n@returns(201) {data: map{id: str(uuid), created_at: str, updated_at: str, name: str, type: str, values: [any]}} # Wireless Blocklist created\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endpoint DELETE /wireless_blocklists/{id}\n@desc Delete a Wireless Blocklist\n@required {id: str(uuid) # Identifies the wireless blocklist.}\n@returns(204) Wireless Blocklist deleted\n@errors {404: Resource not found, 422: Wireless Blocklist is still assigned}\n\n@endpoint GET /wireless_blocklists/{id}\n@desc Get a Wireless Blocklist\n@required {id: str(uuid) # Identifies the wireless blocklist.}\n@returns(200) {data: map{id: str(uuid), created_at: str, updated_at: str, name: str, type: str, values: [any]}} # Successful Response\n@errors {404: Resource not found}\n\n@endpoint PATCH /wireless_blocklists/{id}\n@desc Update a Wireless Blocklist\n@required {id: str(uuid) # Identifies the wireless blocklist.}\n@optional {name: str # The name of the Wireless Blocklist., values: [any] # Values to block. The values here depend on the `type` of Wireless Blocklist.}\n@returns(202) {data: map{id: str(uuid), created_at: str, updated_at: str, name: str, type: str, values: [any]}} # Update accepted and processed asynchronously. Poll GET /wireless_blocklists/{id} to check the result.\n@errors {422: Unprocessable entity. Check the 'detail' field in response for details.}\n\n@endgroup\n\n@group x402\n@endpoint POST /x402/credit_account\n@desc Settle a payment\n@required {id: str # The quote ID to settle.}\n@optional {PAYMENT-SIGNATURE: str # Signed payment authorization for the quote. Alternative to providing `payment_signature` in the request body., payment_signature: str # Base64-encoded signed payment authorization (x402 PaymentPayload). Can alternatively be provided via the PAYMENT-SIGNATURE header.}\n@returns(200) {data: map{id: str, record_type: str, amount: str, currency: str, status: str, quote_id: str, tx_hash: str?, created_at: str(date-time)}} # Payment already settled (idempotent response)\n@returns(201) {data: map{id: str, record_type: str, amount: str, currency: str, status: str, quote_id: str, tx_hash: str?, created_at: str(date-time)}} # Payment settled successfully\n@errors {400: Bad request — invalid signature, expired authorization, invalid nonce, or malformed payment payload, 401: Unauthorized, 403: Forbidden — x402 payments not enabled, account tier ineligible, or account suspended, 422: Unprocessable entity — missing required parameters or insufficient funds/allowance, 500: Internal server error — facilitator unavailable, transaction failed on-chain, or unknown error, 502: Bad gateway — upstream settlement service error, 503: Service unavailable — facilitator or settlement timeout}\n@example_request {\"id\":\"quote_abc123\",\"payment_signature\":\"0xabc123...\"}\n\n@endpoint GET /x402/credit_account/payments\n@desc List x402 payments\n@optional {page[number]: int=1: any # The page number to load., page[size]: int=100 # The size of the page.}\n@returns(200) {data: [map], meta: map{page_number: int, page_size: int, total_pages: int, total_results: int}} # List of x402 payment transactions\n@errors {401: Unauthorized, 403: Forbidden — x402 payments not enabled or account tier ineligible}\n\n@endpoint GET /x402/credit_account/payments/{id}\n@desc Get an x402 payment\n@required {id: str(uuid) # The x402 payment transaction ID.}\n@returns(200) {data: map{id: str(uuid), record_type: str, amount: str, currency: str, status: str, quote_id: str, tx_hash: str?, created_at: str(date-time), updated_at: str(date-time)}} # x402 payment transaction details\n@errors {401: Unauthorized, 403: Forbidden — x402 payments not enabled or account tier ineligible, 404: Not found — the transaction does not exist or belongs to another user}\n\n@endpoint POST /x402/credit_account/quote\n@desc Create a payment quote\n@required {amount_usd: str # Amount in USD to fund (minimum 5.00, maximum 10000.00).}\n@returns(200) {data: map{id: str, record_type: str, amount_usd: str, amount_crypto: str, network: str, expires_at: str(date-time), payment_requirements: map{x402Version: int, resource: map{url: str, description: str, mimeType: str}, accepts: [map]}}} # Quote created successfully\n@errors {401: Unauthorized, 403: Forbidden — x402 payments not enabled, account tier ineligible, or account suspended, 422: Unprocessable entity — invalid amount, 502: Bad gateway — upstream payment service failed to create quote}\n@example_request {\"amount_usd\":\"50.00\"}\n\n@endgroup\n\n@end\n"}}