ThunderPhone 2.0 jest już dostępny.Uruchom samodzielnie — od 2 centów/min.Przeczytaj komunikat

Webhooks

Katalog zdarzeń

Wszystkie typy zdarzeń webhook wysyłane przez ThunderPhone.

Każda treść webhooka ma pole type, którego wartością jest jeden z typów zdarzeń na tej stronie. Gdy subskrybujesz punkt końcowy, tablica events musi zawierać wybrane typy zdarzeń (lub być pusta, aby subskrybować wszystkie — z wyjątkiem zdarzeń dla każdej tury telephony.turn / web.turn, które są dostarczane tylko do punktów końcowych, które wyraźnie je wskazują).

Te zdarzenia są przekazywane w dwóch stylach:

  • Dostarczenia do punktu końcowego są zawsze nieblokującymi powiadomieniami z ponownymi próbami: odpowiedz dowolnym kodem 2xx; koperta zawiera event_id, według którego można przeprowadzić deduplikację.
  • Wymiany blokujące działają tylko w starszym webhooku z jednym adresem URL: żądanie konfiguracji telephony.incoming / web.incoming (numery w trybie webhooka i klucze widżetu, limit czasu 10 s) oraz dyspozycje narzędzi w trybie webhooka. Twoja odpowiedź kształtuje rozmowę na żywo.

Poniższe przykładowe ładunki pokazują kopertę punktu końcowego w kolejności przesyłania (klucze posortowane alfabetycznie: data, event_id, type); starsze dostarczenia zawierają te same data bez event_id.

Zdarzenia połączeń

telephony.incoming

Wysyłane, gdy połączenie przychodzące dociera na jeden z Twoich numerów telefonów. Dostawy do endpointu to powiadomienia typu fire-and-forget wysyłane dla każdego połączenia przychodzącego, niezależnie od tego, czy numer jest skonfigurowany dla agenta, czy webhooka. Numery bez przypisanego agenta otrzymują dodatkowo blokujące żądanie konfiguracji w starszym webhooku — pełny schemat żądania i odpowiedzi znajdziesz w telephony.incoming / web.incoming.

{
  "data": {
    "call_id": 987654321,
    "from_number": "+14155550199",
    "to_number": "+15551234567"
  },
  "event_id": "3f6b2ad0-1c9e-4a57-9f2b-8f6f0f9d2f11",
  "type": "telephony.incoming"
}

telephony.complete

Wysyłane po zakończeniu przychodzącego lub wychodzącego połączenia telefonicznego. Nie blokuje. Obejmuje transkrypcję, adres URL nagrania, gdy jest dostępny, oraz podsumowanie rozliczeń. Schemat ładunku znajdziesz w telephony.complete / web.complete.

telephony.tool

Wysyłane po wywołaniu przez połączenie telefoniczne narzędzia funkcji. Nieblokujące powiadomienie audytowe — narzędzie zostało już wykonane w momencie dostarczenia tego zdarzenia; dotyczy własnych narzędzi funkcji, a nie wbudowanych narzędzi, narzędzi bazy wiedzy, połączeń aplikacji ani narzędzi MCP.

{
  "data": {
    "arguments": { "date": "2026-04-21" },
    "call_id": 987654321,
    "from_number": "+14155550199",
    "response": {
      "response": { "available_slots": ["9:00 AM", "2:00 PM"] },
      "status": 200
    },
    "to_number": "+15551234567",
    "tool_name": "search_appointments"
  },
  "event_id": "1f0a7c3e-52d4-4a0e-8f4b-b1a6a1c0d9e2",
  "type": "telephony.tool"
}

response to wynik wykonania: {"status": <http status>, "response": <your endpoint's JSON>} w przypadku powodzenia lub {"status": <status>, "error": "<message>"} w przypadku błędu.

telephony.turn

Wysyłane w trakcie trwającego połączenia telefonicznego, raz dla każdej tury zawierającej mowę, w momencie jej wystąpienia — wypowiedzianych odpowiedzi agenta oraz transkrybowanych tur rozmówcy. Umożliwia śledzenie rozmowy na żywo za pomocą zwykłych webhooków zamiast odpytywania GET /v1/calls/{call_id}/transcript. Nie blokuje.

{
  "data": {
    "call_id": 987654321,
    "entry_type": "completion",
    "from_number": "+14155550199",
    "position": 7,
    "role": "assistant",
    "start_ms": 15200,
    "text": "How many employees does your company have?",
    "to_number": "+15551234567"
  },
  "event_id": "8d3f5a2c-7b1e-4c9a-b6d0-2e4f6a8c0d1e",
  "type": "telephony.turn"
}
PoleTypOpis
positionintegerIndeks tury w historii połączenia — stabilny identyfikator do sortowania
rolestringassistant (mowa agenta) lub user (mowa rozmówcy)
textstringTekst transkrypcji tury znany w momencie emisji
entry_typestringTyp bazowego wpisu historii: completion (agent) lub user_turn / span (rozmówca)
start_ms, end_msintegerPrzesunięcia audio w ms od rozpoczęcia połączenia; obecne tylko, gdy czas odtwarzania był już znany w momencie emisji

web.incoming

Odpowiednik telephony.incoming dla kanału internetowego, wysyłany po rozpoczęciu sesji widżetu internetowego lub testowego połączenia mikrofonowego w kreatorze. Dostawy do endpointu to powiadomienia typu fire-and-forget dla każdej sesji internetowej. Klucze publikowalne w mode="webhook" otrzymują dodatkowo blokujące żądanie konfiguracji w starszym webhooku — to blokujące żądanie ma inną strukturę (origin_domain, publishable_key_prefix; bez numerów telefonów). Zobacz telephony.incoming / web.incoming.

{
  "data": {
    "call_id": 987654322,
    "from_number": "web",
    "origin_domain": "https://example.com",
    "publishable_key_prefix": "pk_live_a1b2",
    "to_number": "+15551234567"
  },
  "event_id": "9a2b4c6d-8e0f-4a1b-9c2d-3e4f5a6b7c8d",
  "type": "web.incoming"
}

from_number zawsze ma dosłowną wartość "web". W przypadku sesji widżetu w trybie webhook to_number jest puste (numer agenta dla sesji jest przypisywany po konfiguracji); w przypadku testowych połączeń mikrofonowych w kreatorze origin_domain i publishable_key_prefix są puste.

web.complete

Odpowiednik telephony.complete dla kanału internetowego, obejmujący połączenia widżetu internetowego (direction: "web") i testowe połączenia mikrofonowe w kreatorze (direction: "test"). Nie blokuje. Ma taką samą strukturę ładunku jak telephony.complete, dodatkowo z origin_domain oraz z from_number ustawionym na "web".

web.tool

Odpowiednik telephony.tool dla kanału internetowego. Element data zawiera origin_domain zamiast from_number / to_number.

web.turn

Odpowiednik telephony.turn dla kanału internetowego, obejmujący połączenia widżetu internetowego i testowe połączenia mikrofonowe w kreatorze. Ma taką samą strukturę ładunku, z origin_domain zamiast from_number / to_number. Podobnie jak telephony.turn, wymaga jawnej subskrypcji — nigdy nie jest dostarczany przez pustą tablicę events.


Zdarzenia głosowe

Tworzenie niestandardowego głosu odbywa się asynchronicznie. Te nieblokujące zdarzenia umożliwiają reagowanie na wynik końcowy zamiast odpytywania punktu końcowego szczegółów klonu.

voice.ready

Wysyłane, gdy niestandardowy głos zakończy przetwarzanie i może zostać przypisany do agenta.

{
  "data": {
    "voice": {
      "created_at": "2026-07-30T14:12:08.317Z",
      "display_name": "Support voice",
      "failure_reason": "",
      "gender": "female",
      "id": "cv_2f6f90b0e9a34ee8b39be7d1",
      "language": "en",
      "name": "custom:cv_2f6f90b0e9a34ee8b39be7d1",
      "status": "ready",
      "updated_at": "2026-07-30T14:13:31.605Z"
    }
  },
  "event_id": "2d5f0a61-e9b5-4a3c-b684-29d7d9e4b214",
  "type": "voice.ready"
}

voice.failed

Wysyłane, gdy przetwarzanie niestandardowego głosu zakończy się trwałym błędem.

{
  "data": {
    "reason": "audio sample could not be processed",
    "voice": {
      "created_at": "2026-07-30T14:12:08.317Z",
      "display_name": "Support voice",
      "failure_reason": "audio sample could not be processed",
      "gender": "female",
      "id": "cv_2f6f90b0e9a34ee8b39be7d1",
      "language": "en",
      "name": "custom:cv_2f6f90b0e9a34ee8b39be7d1",
      "status": "failed",
      "updated_at": "2026-07-30T14:13:31.605Z"
    }
  },
  "event_id": "3493e985-1a75-4f77-a10a-e74af440cd31",
  "type": "voice.failed"
}
PoleTypOpis
voice.idstringPubliczny identyfikator niestandardowego głosu
voice.namestringWartość głosu agenta w formie custom:<public_id>
voice.display_namestringNazwa głosu widoczna dla organizacji
voice.languagestringKod jedynego języka klonu
voice.genderstringmale, female lub pusty ciąg znaków
voice.statusstringready dla voice.ready; failed dla voice.failed
voice.failure_reasonstringPuste w przypadku powodzenia; szczegóły błędu przetwarzania w przypadku niepowodzenia
voice.created_at, voice.updated_attimestampZnaczniki czasu ISO 8601
reasonstringSzczegóły błędu; obecne tylko dla voice.failed

Zdarzenia jakości

call.graded

Wysyłane po zakończeniu uruchomienia oceniania przez AI dla połączenia. Nieblokujące.

{
  "data": {
    "call_id": 987654321,
    "grade": {
      "call_outcome": "success",
      "created_at": "2026-04-20T18:25:11.002Z",
      "detected_issues": [],
      "graded_at": "2026-04-20T18:25:11.002Z",
      "grader_model": "heuristic-v1",
      "id": 5512,
      "score": 92,
      "status": "completed",
      "summary": "Caller asked about their policy and got a full answer…"
    }
  },
  "event_id": "7c1d2e3f-4a5b-4c6d-8e9f-0a1b2c3d4e5f",
  "type": "call.graded"
}
PoleTypOpis
grade.idintegerIdentyfikator oceny
grade.scoreinteger | null0–100
grade.call_outcomestringsuccess, failure, unknown lub no_conversation
grade.summarystringJednoakapitowe podsumowanie
grade.detected_issuesarrayCiągi opisujące problemy wykryte przez oceniający moduł
grade.statusstringZawsze completed — emitowane są tylko zakończone uruchomienia
grade.grader_modelstringModuł oceniający, który wygenerował wynik (np. heuristic-v1)
grade.graded_at, grade.created_attimestamp

issue.reported

Wysyłane po utworzeniu raportu problemu — zgłoszonego przez użytkownika z poziomu panelu (source: "user") albo utworzonego automatycznie przez ocenianie połączenia (source: "system"). Nieblokujące.

{
  "data": {
    "call_id": 987654321,
    "issue_report": {
      "created_at": "2026-04-20T18:25:11.002Z",
      "description": "Five-second silence before responding to the main question.",
      "id": 4321,
      "severity": "warning",
      "source": "system",
      "status": "open",
      "title": "Agent paused too long"
    }
  },
  "event_id": "5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b",
  "type": "issue.reported"
}
PoleTypOpis
issue_report.severitystringcritical, warning lub info
issue_report.statusstringopen lub resolved
issue_report.sourcestringuser (zgłoszone z poziomu panelu) lub system (utworzone przez ocenianie)

Zdarzenia połączeń testowych

test-call.completed

Wysyłane, gdy uruchomienie połączenia testowego osiągnie status końcowy — completed lub failed, w tym uruchomienia, które nie powiodły się podczas uruchamiania i nigdy nie utworzyły połączenia. Nieblokujące. Przydatne do podłączania wsadowych uruchomień CI do systemów czatu i powiadomień.

{
  "data": {
    "test_call_run": {
      "call_id": 987654321,
      "completed_at": "2026-04-20T18:25:04.822Z",
      "error_message": "",
      "id": 7110,
      "status": "completed",
      "target_id": 12,
      "target_type": "agent"
    }
  },
  "event_id": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
  "type": "test-call.completed"
}
PoleTypOpis
test_call_run.target_typestringagent lub phone_number
test_call_run.target_idintegerIdentyfikator agenta lub numeru telefonu, do którego było skierowane uruchomienie, zgodny z target_type
test_call_run.statusstringcompleted lub failed
test_call_run.call_idinteger | nullnull, gdy uruchomienie nie powiodło się przed wykonaniem połączenia
test_call_run.error_messagestringPuste w przypadku powodzenia

Zdarzenia alertów

alert.triggered

Wysyłane, gdy reguła alertu z włączonym kanałem Dostarczaj do webhooków deweloperskich przekroczy próg. Nie blokuje. Reguła uruchamia się raz, a następnie uwzględnia okres karencji, więc utrzymujące się naruszenie powoduje jedno zdarzenie na każde okno okresu karencji.

{
  "data": {
    "comparator": "lt",
    "event_id": "b8e6a1d4-2c3f-4a5b-9c8d-7e6f5a4b3c2d",
    "fired_at": "2026-04-20T18:00:00+00:00",
    "metric": "success_rate",
    "metric_value": 71.4,
    "rule_id": "d2c3b4a5-6f7e-4d8c-9b0a-1c2d3e4f5a6b",
    "rule_name": "Success rate below 80%",
    "threshold": 80.0,
    "window_hours": 24
  },
  "event_id": "4d5e6f7a-8b9c-4d0e-9f1a-2b3c4d5e6f7a",
  "type": "alert.triggered"
}
PoleTypOpis
event_id (w data)UUIDIdentyfikator uruchomienia alertu — odrębny od identyfikatora event_id dostarczenia w kopercie
rule_id, rule_nameUUID, ciąg znakówReguła, która się uruchomiła
metricciąg znakówsuccess_rate, failure_rate, avg_score, call_volume lub suite_regression
comparatorciąg znakówlt, lte, gt lub gte
metric_valueliczbaWartość metryki w oknie, gdy reguła się uruchomiła
thresholdliczbaSkonfigurowany próg
window_hoursliczba całkowitaKroczące okno oceny
fired_atznacznik czasu

Zapoznaj się z przewodnikiem po alertach, aby tworzyć reguły, metryki, okresy karencji oraz kanały e-mail / Slack.


Powiązane