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:
- Edit nodes or prompts in Draft.
- Test via WebRTC Audio, Direct Text Chat, Direct Test Call, or Draft API (
POST /api/v1/public/agent/test/{trigger_path}). - Inspect live streaming events, transcripts, and extracted variables.
- 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(multipartfile+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_apifiller messages, andtransfer_callpre-transfer announcements.
2. Testing Channels & Public Web Embeds
| Channel | Version Used | Billing & Limits | Key Builder Notes |
|---|---|---|---|
| Browser WebRTC Playground | Draft | ₹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 Call | Draft | Billed 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 Playground | Draft | ₹0 | Mirrors node transitions, extraction, and tool calls without voice synthesis. |
| Public Web Embed Widget | Published | Billed for voice once org is active | Supports 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 withusage_limit, guard concurrent dashboard config edits viaexpected_revision(HTTP 409on mismatch), and block untrusted browser variable spoofing (allow_client_context_vars=falseby default). - Session Lifecycle (
EmbedSession): Issued embed sessions expire after1 hour, cap conversation length at50turns (HTTP 429), auto-close idle sessions after1800sby default (configurable60–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}withX-API-Key): Intentionally lightweight—returns onlyrun_id,is_completed,extracted_data, andcall_disposition. (Hereextracted_datareturns Post-Call Intelligence output verbatim if non-empty, otherwise falling back togathered_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, mergedextracted_data, and execution logs (list endpoints omit heavylogsandannotations). - Live Transcript Streaming (2 Options):
- Real-Time SSE Stream:
GET /api/v1/public/agent/run/{run_id}/stream?api_key=...(text/event-streamwith1sheartbeats). - JSON Snapshot Poll:
GET /api/v1/public/agent/run/{run_id}/live-transcript(single JSON state response).
- Real-Time SSE Stream:
- CSV & Daily Reports: Export per-workflow reports via
GET /api/v1/workflow/{workflow_id}/reportor fleet/org daily summaries via/api/v1/organizations/reports/dailyand/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:
{
"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:
- Non-telemetry keys in
gathered_context(lowest — telemetry keys such ascall_tags,provider,call_id,nodes_visited,call_disposition,mapped_call_disposition,Transcript URL,Recording URLare excluded) gathered_context.extracted_variables(middle — live node-level extractions; e.g."budget": "25000","intent": "maybe")- 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
| Category | Canonical Values / Signals | Meaning & Campaign Behavior |
|---|---|---|
| Connected / Completed | completed, user_qualified, user_hangup, end_call_tool, call_transferred, user_disqualified, answered, call_duration_exceeded, user_idle_max_duration_exceeded | Live conversation occurred (or terminated intentionally by node/guardrail). Never retried in campaigns. |
| Unanswered / Voicemail | busy, no-answer, no_answer, unanswered, voicemail, rejected, timeout | Callee 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 Block | failed, error, canceled, cancelled, quota_exhausted | Telephony 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). |
Running Bulk Campaigns
Prepare campaign CSVs, configure caller-ID pools, calling schedules, retry rules, circuit breakers, and launch, monitor, or redial outbound campaigns safely.
Notifications, Emails & In-App Announcements
Understand what alerts clients receive across onboarding, low balance, billing, and suspensions, how sub-org bell inheritance works, and how scheduled digests and announcements operate.