Skip to content

Webhook events AutoCall

Khi cuộc gọi xảy ra -> Zorio POST event tới URL khách hàng đăng ký (HMAC signed).

Events

EventKhi nào fire
autocall.lead.addedLead push vào campaign thành công
autocall.lead.audio_readyAudio TTS render xong, lead sẵn sàng dial
autocall.call.initiatedEngine bắt đầu originate
autocall.call.answeredB-leg answer máy
autocall.dtmf.pressedUser bấm phím (1 event/lần bấm)
autocall.call.transferredDTMF action = queue -> chuyển queue thành công
autocall.call.completedCuộc gọi kết thúc (mọi result)
autocall.lead.completedLead hoàn tất tất cả retry (final status)
autocall.campaign.completedCampaign hết lead pending
autocall.tts.render_failedTTS provider lỗi, lead bị skip

Envelope chung

Mọi event đều có cấu trúc envelope:

FieldTypeMô tảGiá trị hợp lệ
eventstringTên event đầy đủautocall.<entity>.<action>
timestampdatetimeLúc Zorio publish event (ISO 8601 UTC)
tenant_idintegerID tài khoản nhận webhook
dataobjectPayload event-specific (xem từng event bên dưới)

data fields theo từng event

autocall.lead.added / autocall.lead.audio_ready / autocall.lead.completed

FieldTypeMô tảGiá trị hợp lệ
lead_idintegerID lead trong AutoCall
campaign_idintegerID campaign chứa lead
phonestringSố điện thoại leadE.164 hoặc nội địa VN
external_refstring|nullTham chiếu CRM bên ngoài (nếu khách push kèm)
audio_urlstring|nullURL audio TTS (chỉ có khi event = audio_ready)
final_statusstringTrạng thái cuối (chỉ có khi event = lead.completed)completed / failed / dnc / max_attempts_reached
total_attemptsintegerSố lần đã quay số (chỉ có khi lead.completed)≥ 1

autocall.call.initiated

FieldTypeMô tảGiá trị hợp lệ
uuidstringUUID cuộc gọi
campaign_idintegerID campaign
lead_idintegerID lead
phonestringSố bị quay
attempt_numberintegerLần quay thứ mấy≥ 1
caller_idstringCaller-ID dùng để gọi ra
started_atdatetimeThời điểm originate (ISO 8601 UTC)

autocall.call.answered

Bao gồm các field như call.initiated cộng thêm:

FieldTypeMô tảGiá trị hợp lệ
answered_atdatetimeLúc B-leg nhấc máy (ISO 8601 UTC)

autocall.dtmf.pressed

FieldTypeMô tảGiá trị hợp lệ
uuidstringUUID cuộc gọi
campaign_idintegerID campaign
lead_idintegerID lead
phonestringSố đang gọi
digitstringPhím vừa bấm0-9, *, #
pressed_atdatetimeLúc nhận DTMF (ISO 8601 UTC)

autocall.call.transferred

FieldTypeMô tảGiá trị hợp lệ
uuidstringUUID cuộc gọi
campaign_idintegerID campaign
lead_idintegerID lead
transfer_targetstringĐích chuyển tiếpqueue:<queue_name> / extension:<ext>
transferred_atdatetimeLúc chuyển queue thành công (ISO 8601 UTC)

autocall.call.completed

FieldTypeMô tảGiá trị hợp lệ
uuidstringUUID cuộc gọi
campaign_idintegerID campaign
lead_idintegerID lead
phonestringSố đã gọi
attempt_numberintegerLần quay thứ mấy≥ 1
started_atdatetimeLúc originate (ISO 8601 UTC)
answered_atdatetime|nullLúc bắt máy (null nếu không nhấc)
ended_atdatetimeLúc cúp máy (ISO 8601 UTC)
duration_secintegerTổng thời lượng cuộc gọi (giây)≥ 0
resultstringKết quả phân loạiconnected / no_answer / busy / failed / voicemail / dnc_blocked
hangup_causestringMã hangup chuẩn Q.850 từ Zorio PBXNORMAL_CLEARING / NO_ANSWER / USER_BUSY / CALL_REJECTED / ...
dtmf_pressedstring|nullPhím cuối user bấm
final_actionstring|nullHành động cuối (theo DTMF script)queue:<name> / hangup / dnc_added / null

autocall.campaign.completed

FieldTypeMô tảGiá trị hợp lệ
campaign_idintegerID campaign vừa hoàn tất
campaign_namestringTên campaign
total_leadsintegerTổng số lead trong campaign≥ 0
total_connectedintegerSố lead bắt máy thành công≥ 0
completed_atdatetimeLúc campaign hoàn tất (ISO 8601 UTC)

autocall.tts.render_failed

FieldTypeMô tảGiá trị hợp lệ
lead_idintegerID lead bị skip
campaign_idintegerID campaign
providerstringNhà cung cấp TTS gặp lỗitts_provider_01 / tts_provider_02 / tts_provider_03 / local
error_codestringMã lỗiRATE_LIMIT / INVALID_VOICE / QUOTA_EXCEEDED / UNKNOWN
error_messagestringMô tả lỗi
failed_atdatetimeLúc TTS lỗi (ISO 8601 UTC)

Cấu hình Webhook (qua Admin Console, KHÔNG qua Public API)

Webhook KHÔNG đăng ký qua API

Theo policy bảo mật của Zorio, cấu hình webhook chỉ thực hiện thủ công qua Admin Console (Admin Console). Public API chỉ phục vụ nghiệp vụ AutoCall (campaign / lead / call lifecycle / reports).

Lý do:

  • Tránh lạm dụng: nếu cho client tự đăng ký, hacker có thể dùng token để redirect webhook ra URL ngoài tài khoản.
  • Đảm bảo audit: mỗi thay đổi webhook config được log ở admin activity.
  • Tách bạch nghiệp vụ vs config: public API focused vào dữ liệu cuộc gọi.

Quy trình bạn tích hợp:

  1. Liên hệ quản trị hệ thống (trong tổ chức) hoặc đội ngũ Zorio support.
  2. Cung cấp:
    • URL endpoint nhận webhook (HTTPS)
    • Danh sách events cần subscribe (xem mục Events)
    • Tùy chọn: IP allowlist của hạ tầng bạn
  3. Quản trị hệ thống cấu hình trong Admin Console + chọn events -> lưu.
  4. Hệ thống generate secret (32 bytes base64) -> gửi cho bạn qua kênh bảo mật.
  5. Anh chị deploy webhook receiver + dùng secret để verify HMAC signature (xem Headers).

Thay đổi config (đổi URL, thêm events, rotate secret) — cũng qua Admin Console, không qua API.

Delivery payload mẫu (event autocall.call.completed)

json
{
  "event": "autocall.call.completed",
  "timestamp": "2026-06-24T08:32:47Z",
  "tenant_id": 1,
  "data": {
    "uuid": "093e1024-...",
    "campaign_id": 36,
    "lead_id": 78912,
    "phone": "84912345678",
    "attempt_number": 1,
    "started_at": "2026-06-24T08:32:00Z",
    "answered_at": "2026-06-24T08:32:05Z",
    "ended_at": "2026-06-24T08:32:47Z",
    "duration_sec": 42,
    "result": "connected",
    "hangup_cause": "NORMAL_CLEARING",
    "dtmf_pressed": "2",
    "final_action": "queue:support_queue"
  }
}

Headers POST từ Zorio tới URL khách

HeaderTypeMô tảGiá trị
X-Zorio-SignaturestringHMAC-SHA256 raw body với webhook secretsha256=<hex>
X-Zorio-TimestampintegerEpoch giây (UTC) — client reject nếu lệch > 300s
X-Zorio-EventstringConvenience copy của event fieldautocall.<entity>.<action>
X-Zorio-DeliverystringDelivery UUID — dùng dedupe khi retryUUID v4
Content-TypestringLoại nội dungapplication/json; charset=utf-8

Verify HMAC

Pseudo-code:

expected = "sha256=" + hex(hmac_sha256(secret, raw_request_body))
if expected != header["X-Zorio-Signature"]: reject

KHÔNG verify trên JSON đã parse — phải dùng raw body bytes.

Retry policy

  • 3 lần retry: 5s, 30s, 5 phút
  • Sau 3 lần fail -> deadletter (admin xem qua Admin Console)
  • HTTP 2xx = success. 4xx/5xx = fail.

Idempotency client-side

Client phải đảm bảo endpoint idempotent (check X-Zorio-Delivery UUID) vì webhook có thể được gửi lại nếu HTTP timeout phía Zorio nhưng response đã thực thi xong phía client.

Cấp phép theo điều khoản sử dụng của Zorio.