Skip to Content
Builder Docs
Telephony, Calls & Campaigns

Workflow Versions, Publishing & Call Logs

Manage draft vs. published agent versions safely, manage Custom Recordings, test via WebRTC, text chat, or phone/SIP, configure Public Web Embeds, and inspect transcripts and dispositions.

Workflow Versions, Publishing & Call Logs

Once an agent workflow is built, you should be able to iterate on prompts safely without breaking live client phone lines. Talkar separates Draft editing from Published production traffic.


1. Draft vs. Published Versions & Custom Recordings

  • Draft Version (draft): Every visual edit on nodes, edges, prompts, voice settings, or tools modifies your working draft (POST /api/v1/workflow/{id}/create-draft, POST /api/v1/workflow/{id}/duplicate, PUT /api/v1/workflow/{id}/status).
  • Published Version (published): Publishing (POST /api/v1/workflow/{id}/publish) freezes an immutable snapshot used by live inbound DIDs, bulk campaigns, Public Web Embed widgets, and External Trigger API calls.
  • Safe Iteration Loop:
    1. Edit nodes or prompts in Draft.
    2. Test via WebRTC Audio, Direct Text Chat, Direct Test Call, or Draft API (POST /api/v1/public/agent/test/{trigger_path}).
    3. Inspect live streaming events, transcripts, and extracted variables.
    4. Publish when satisfied so production traffic switches atomically.

Custom Pre-Recorded Audio Clips (Custom Recordings)

For compliance disclaimers, brand greetings, or hold prompts where recorded voice talent beats real-time TTS:

  • Upload Limits: Up to 5 MB per audio file, with batch uploads of up to 20 files at a time.
  • Auto-Transcription: Trigger POST /api/v1/workflow-recordings/transcribe (multipart file + language) to generate an exact text transcript for your prompt context.
  • Automatic Rename Rewriting: Renaming a Custom Recording automatically rewrites RECORDING_ID: references inside workflow prompts so nothing breaks.
  • Where Supported: Inside Agent / Start / End Call node prompts, transition prompts, http_api filler messages, and transfer_call pre-transfer announcements.

2. Testing Channels & Public Web Embeds

ChannelVersion UsedBilling & LimitsKey Builder Notes
Browser WebRTC PlaygroundDraft₹0 (max 2 concurrent) only during agent_building. Once org is active, WebRTC checks wallet reserve and bills per minute.Immediate mic-to-agent latency and VAD tuning inside the browser.
Direct Test CallDraftBilled once active (uses org wallet + trunk)Supports PSTN numbers and SIP destinations (PJSIP/..., SIP/...); defaults to preferences.test_phone_number if omitted. Audio uses trunk rate (8 kHz, or 16 kHz on Vonage).
Text Chat PlaygroundDraft₹0Mirrors node transitions, extraction, and tool calls without voice synthesis.
Public Web Embed WidgetPublishedBilled for voice once org is activeSupports voice OR chat mode (not combined "both"), rendered as floating, inline, or headless widgets.

Public Web Embed Security & Session Controls

  • Access Controls: Enforce origin checks with allowed_domains, cap total completions with usage_limit, guard concurrent dashboard config edits via expected_revision (HTTP 409 on mismatch), and block untrusted browser variable spoofing (allow_client_context_vars=false by default).
  • Session Lifecycle (EmbedSession): Issued embed sessions expire after 1 hour, cap conversation length at 50 turns (HTTP 429), auto-close idle sessions after 1800s by default (configurable 60–10500s, swept every 5 min), and apply strict public PII/trace redaction to public endpoints.

3. Reading Call Logs, Live Streams, Reports & Dispositions

Public Summary vs. Full Run Inspection

  • Public Run Summary (GET /api/v1/public/agent/run/{run_id} with X-API-Key): Intentionally lightweight—returns only run_id, is_completed, extracted_data, and call_disposition. (Here extracted_data returns Post-Call Intelligence output verbatim if non-empty, otherwise falling back to gathered_context.extracted_variables.)
  • Full Run Detail (GET /api/v1/workflow/{workflow_id}/runs/{run_id}): Authenticated endpoint returning full turn-by-turn transcripts, signed audio recording download URLs, annotations, merged extracted_data, and execution logs (list endpoints omit heavy logs and annotations).
  • Live Transcript Streaming (2 Options):
    • Real-Time SSE Stream: GET /api/v1/public/agent/run/{run_id}/stream?api_key=... (text/event-stream with 1s heartbeats).
    • JSON Snapshot Poll: GET /api/v1/public/agent/run/{run_id}/live-transcript (single JSON state response).
  • CSV & Daily Reports: Export per-workflow reports via GET /api/v1/workflow/{workflow_id}/report or fleet/org daily summaries via /api/v1/organizations/reports/daily and /api/v1/organizations/reports/daily/runs.

Sample Run Detail Response & Merge Precedence

Run list endpoints omit logs and annotations (null), while GET /api/v1/workflow/{workflow_id}/runs/{run_id} returns the full payload including QA annotations:

GET /api/v1/workflow/103/runs/9093 (trimmed)
{
  "id": 9093,
  "workflow_id": 103,
  "name": "WR-API-4821",
  "mode": "plivo",
  "call_type": "outbound",
  "is_completed": true,
  "duration_seconds": 142,
  "disposition": "user_qualified",
  "phone_number": "+919876543210",
  "attempt_number": 2,
  "is_retry": true,
  "lead_id": "lead-row-42",
  "transcript_public_url": "https://api.example.com/api/v1/public/download/workflow/<token>/transcript",
  "recording_public_url": "https://api.example.com/api/v1/public/download/workflow/<token>/recording",
  "initial_context": {
    "customer_name": "Rohan Sharma",
    "called_number": "+919876543210",
    "caller_number": "+918061234567"
  },
  "gathered_context": {
    "mapped_call_disposition": "user_qualified",
    "call_tags": ["user_qualified", "demo_requested"],
    "extracted_variables": {
      "budget": "25000",
      "intent": "maybe"
    }
  },
  "extracted_data": {
    "budget": "25000",
    "intent": "high",
    "call_summary": "Caller confirmed Rs 25k/mo budget and asked for Thursday demo."
  },
  "annotations": {
    "tags": ["clear_audio", "polite"],
    "qa_4": {
      "model": "gpt-4o-mini",
      "node_results": {
        "whole_call": {
          "node_name": "whole_call",
          "tags": ["clear_audio", "polite"],
          "summary": "Agent followed qualification checklist accurately.",
          "score": 9,
          "overall_sentiment": "positive",
          "raw_response": "{...}"
        }
      }
    }
  },
  "usage_info": {
    "llm": {},
    "tts": {},
    "stt": {},
    "call_duration_seconds": 142
  }
}

How extracted_data Merges Sources

When the Run API builds top-level extracted_data, it merges from lowest to highest priority:

  1. Non-telemetry keys in gathered_context (lowest — telemetry keys such as call_tags, provider, call_id, nodes_visited, call_disposition, mapped_call_disposition, Transcript URL, Recording URL are excluded)
  2. gathered_context.extracted_variables (middle — live node-level extractions; e.g. "budget": "25000", "intent": "maybe")
  3. Post-Call Intelligence workflow_run.extracted_data (highest — overwrites matching keys such as "intent": "high" and adds "call_summary")

(For frontend widget API setup, see Public Web Embeds.)

Canonical Call Dispositions Reference

CategoryCanonical Values / SignalsMeaning & Campaign Behavior
Connected / Completedcompleted, user_qualified, user_hangup, end_call_tool, call_transferred, user_disqualified, answered, call_duration_exceeded, user_idle_max_duration_exceededLive conversation occurred (or terminated intentionally by node/guardrail). Never retried in campaigns.
Unanswered / Voicemailbusy, no-answer, no_answer, unanswered, voicemail, rejected, timeoutCallee did not connect with a human (campaign stats classify all of these as unanswered, while automatic retries fire on busy, no-answer, and voicemail-flagged calls voicemail_detected / machine_* / fax). Does not trip circuit breaker.
Failed / Pre-Call Blockfailed, error, canceled, cancelled, quota_exhaustedTelephony failure, cancellation, or wallet/quota block (campaign failures failed, error, call initiation errors, and pipeline errors count toward the circuit breaker; canceled and quota_exhausted do not trip it).

On this page