Skip to Content
Builder Docs
Telephony, Calls & Campaigns

Phone Numbers & Telephony Setup

Configure multi-trunk telephony providers, bind inbound/outbound DIDs, set up caller-ID pools, configure live call transfers, and enable Voicemail / AMD detection.

Phone Numbers & Telephony Setup

Talkar supports connecting multiple carrier trunks per organization under Telephony Configurations across 7 production telephony providers plus 1 Mock simulator, letting you route inbound DIDs to specific agents, balance outbound campaigns across caller-ID pools, transfer live calls to human teams, and detect voicemail machines.


1. Multi-Trunk Telephony Configurations & Phone Numbers

Organizations can hold multiple carrier configurations (for example, a Plivo trunk for India, a Twilio trunk for US/global numbers, and an Asterisk ARI trunk for on-prem PBX routing), with one trunk marked as Default Outbound.

Adding Phone Numbers & Ownership Validation

Each phone number lives under a specific Telephony Configuration:

  • Accepted Address Formats: E.164 (+918061234567, +14155551234), 8–15 bare digits when accompanied by an ISO-2 country_code (e.g. "IN", "US"), short extensions, or SIP URIs (sip: / sips:).
  • Immutability: Once created, a phone number's address cannot be edited—to change a number string, delete the entry and add the updated number.
  • Global Ownership Conflict Guard (HTTP 409): Talkar checks whether an active DID is already owned by another organization (or already registered on the trunk) and rejects conflicting registrations with HTTP 409 Conflict.
  • Single-Call Caller-ID Resolution Order: When placing a single outbound call:
    1. If from_phone_number_id is explicitly provided, it must belong to the selected telephony_configuration_id (mismatch or inactive number rejects cleanly).
    2. Otherwise, Talkar uses the trunk's is_default_caller_id active number.
    3. Otherwise, Talkar picks an available active number from that trunk's pool.
  • Bulk Campaign Pooling: Bulk campaigns rotate outbound calls across all active numbers in the trunk's pool (or prioritize a per-row caller_number with 20s wait fallback).

Canonical Inbound Routing & Carrier Webhook Sync

  • Canonical Inbound Webhook: POST /api/v1/telephony/inbound/run (plus /fallback for carrier error fallback; legacy /inbound/{workflow_id} routes are deprecated).
  • Assigning inbound_workflow_id: Assigning a published workflow to an active DID automatically syncs upstream routing; clearing inbound_workflow_id or deleting the DID detaches upstream hooks first.
  • Per-Number Sync vs. Shared Carrier App Sync:
    • Twilio & Vobiz: Sync per phone number whenever you attach or detach an inbound workflow (Twilio updates VoiceUrl and StatusCallback directly on the IncomingPhoneNumber resource).
    • Plivo, Telnyx, Cloudonix & Vonage: Share an Application / Call Control webhook URL pointing to /api/v1/telephony/inbound/run. For Vonage, configure signature_secret and enable signed_callbacks=true for verified callbacks.
  • Common Inbound TelephonyError Causes: Carrier webhook hits an inactive trunk, unassigned or inactive DID, missing/unpublished inbound_workflow_id, an organization in suspension or pre-live build stages (under_review, pending_approval, info_requested, approved, agent_building), or failed wallet/concurrency admission checks.

2. Supported Telephony Providers (7 Production Providers + Mock)

ProviderSample RateAuto-Configures Carrier App on Save?Live Call TransferKey Notes for Builders
Plivo (plivo)8000 HzYes (creates Plivo Application if application_id omitted)YesPrimary trunk for Indian DIDs (auth_id, auth_token, optional application_id). Shared App webhook model.
Twilio (twilio)8000 HzNo (updates VoiceUrl + StatusCallback per number on attach/detach)YesSupports carrier-level Answering Machine Detection (amd_enabled).
Telnyx (telnyx)8000 HzYes (creates Call Control App if connection_id omitted)YesAdd Mission Control webhook_public_key (Ed25519) to clear security config warnings.
Vonage (vonage)16000 HzNo (manual application_id + RSA private_key)—Enable signed_callbacks=true + signature_secret. Uses 16 kHz wideband telephony audio.
Cloudonix (cloudonix)8000 HzYes (creates cxml Voice App if application_name omitted)YesAutomatically normalizes .cloudonix.net domain suffixes. Supports External Agent Stream WS (WS /api/v1/agent-stream/{provider_name}/{workflow_uuid}).
Vobiz (vobiz)8000 HzYes (creates Vobiz Application if application_id omitted)—Indian SIP/voice carrier (auth_id, auth_token, optional application_id). Per-number callback updates.
Asterisk ARI (ari)8000 HzNo (uses existing Stasis app via ws_client_name)Yes (Stasis bridge)Supports optional VICIdial / External PBX integration when feature-gated on the organization.
Mock Simulator (mock)8000 HzBuilt-in test simulator—Soak-testing simulator with weighted outcomes (completed, busy, no_answer, carrier_error). ₹0 billing.

Media WebSocket Close Codes

Carrier media streams connect over WebSockets (WS). Unexpected session rejections return explicit close codes:

  • 4401 — Unauthorized / invalid authentication signature or credentials.
  • 4409 — Conflict (duplicate active session or concurrency conflict).
  • 4400 — Bad request (missing required media parameters or invalid workflow/run state).

Editing saved telephony credentials

Saved secrets are returned masked in the UI and API. Re-submitting masked placeholders on update safely preserves existing secrets without overwriting them, though you cannot switch the provider type of an existing configuration.


3. Live Call Transfers (transfer_call)

To escalate a call to a human agent, queue, or SIP destination, attach a transfer_call tool to an Agent node.

Destination Resolution Modes

Mode (destination_source)How Destination Is ChosenTypical Use Case
staticFixed E.164 number, SIP URI (PJSIP/1234), or template string like `{{initial_context.transfer_destination}}`Forwarding every qualified caller to one sales ring group or supervisor DID.
dynamicCalls an HTTP resolver URL (timeout_ms 500–5000, default 3000) with Vault auth, parameters / preset_parameters, and automatic OAuth2 401 token refresh retryChecking office hours or CRM account owner in n8n.talkar.in and returning {"transfer_context": {"destination": "+91...", "custom_message": "..."}}.
context_mappingMaps a value in gathered conversation context against 1–100 configured routes + a fallback destinationFeature-gated for External PBX / Asterisk ARI workflows (requires the organization's External PBX feature flag).

Key Transfer Settings

  • Pre-transfer announcement (messageType): Play "none", "custom" TTS text, or "audio" (a pre-recorded clip via audioRecordingId) before bridging the caller.
  • Ring Timeout (timeout): 5 to 120 seconds (default 30s) waiting for the destination leg to answer.

4. Voicemail & Answering Machine Detection (AMD)

Talkar provides two independent mechanisms to detect answering machines and save minutes on unattended calls:

  1. Carrier-Level AMD (Twilio trunks only): Enable amd_enabled on your Twilio telephony config. Twilio evaluates the call answer pattern and reports answered_by (machine_start, machine_end_beep, machine_end_silence, machine_end_other, or fax), appending voicemail_detected to call_tags and triggering campaign voicemail retries if enabled.
  2. In-Pipeline LLM Voicemail Detection: Enabled per workflow inside workflow settings (voicemail_detection, using either the workflow LLM or a dedicated fast detection model with a long_speech_timeout defaulting to 8.0s). Automatically disabled on Realtime Speech-to-Speech workflows. When triggered, Talkar terminates immediately with mapped_call_disposition = "voicemail_detected" and skips final variable extraction.

5. Concurrency Limits, Channel Rejections & Slot Recovery

  • Organization Concurrency Cap: Organizations enforce a Concurrent Call Limit (default platform cap 10, customizable per org). Sub-organizations under a Master Org can also enforce individual sub-org concurrency caps alongside the master fleet cap.
  • No Queuing on Real-Time Channels: Single calls, inbound calls, and WebRTC playground sessions reject immediately if slots are full or quota fails:
ChannelConcurrency RejectionQuota / Wallet Rejection
HTTP Outbound APIHTTP 429 (limit reached) or HTTP 503 (concurrency service unavailable)HTTP 402 Payment Required
WebRTC PlaygroundWS error concurrency_limit_exceeded / concurrency_service_unavailableBlocked pre-session
Inbound TelephonyCarrier XML rejection with CONCURRENT_CALL_LIMITCarrier hangup / TelephonyError
  • Crash Recovery: Active call slots send heartbeats every 10s; any crashed or hung session older than stale thresholds (120s heartbeat miss or 40 min max duration) is automatically reclaimed so capacity never leaks permanently.

On this page