{
"event": "call_ended",
"call": {
"ended_reason": "contact-ended-call",
"call_id": "b4a05730-2abc-4eb0-8066-2e4d23b53ba9",
"loop_id": "ba99c99d-19b9-4a0d-8df6-3e213088989a",
"attempt": 1,
"from_number": "+17755719467",
"direction": "outbound",
"transport": "sip",
"to_number": "+14155552671",
"external_contact_id": "external-123",
"contact_id": "6bd1e7e0-6d00-4c0b-ad5b-daa72457a27d",
"contact_details": {
"company": "Art Studio Inc"
},
"contact_properties": [
{
"key": "industry",
"value": "retail",
"dataType": "string",
"label": "Industry"
}
],
"agent_id": "d8931604-92ad-45cf-9071-d9cd2afbad0c",
"triggered_at": 1731956924302,
"triggered_at_iso": "2024-11-18T15:08:44.302Z",
"started_at": 1731956932264,
"started_at_iso": "2024-11-18T15:08:52.264Z",
"ended_at": 1731957002078,
"ended_at_iso": "2024-11-18T15:10:02.078Z",
"call_length_min": 2,
"call_length_sec": 69,
"call_status": "COMPLETED",
"state": "ended",
"status": "connected",
"follow_up": null,
"transcript": "Agent: Hello...",
"transcriptObject": [
{
"role": "agent",
"content": "Hello..."
},
{
"role": "user",
"content": "Hi, I was hoping to book an appointment."
},
{
"role": "agent",
"toolActivity": "get_available_timeslots",
"type": "function_call"
},
{
"role": "agent",
"content": "I can offer you Thursday at 13:15."
}
],
"call_analysis": {
"appointment": {
"value": true,
"details": "2025-02-18T15:30:00Z"
},
"interest": {
"value": true,
"details": "The customer is interested in buying an ice cream machine"
}
},
"call_outcome": {
"custom_lost_reason": {
"value": "PRODUCT_TOO_EXPENSIVE",
"fieldSchema": {
"type": [
"string",
"null"
],
"enum": [
"CUSTOMER_NOT_INTERESTED",
"CUSTOMER_PREVIOUSLY_CONTACTED",
"PRODUCT_TOO_EXPENSIVE"
]
}
}
},
"collected_data": {
"email": {
"status": "confirmed",
"value": "[email protected]"
},
"delivery_address": {
"status": "confirmed",
"value": "Rosenthaler Straße 51, 10178 Berlin, Germany",
"latitude": 52.5253059,
"longitude": 13.4043936
}
},
"booked_slot_for": "2025-02-24T15:30:00Z",
"appointments": [
{
"id": "c3809aea-0650-461a-ba36-31da19346cd8",
"starts_at": "2025-02-24T15:30:00.000Z",
"timezone": "Europe/Berlin",
"status": "booked",
"hosts": [
{
"name": "Alex Smith",
"email": "[email protected]"
}
],
"reference": {
"provider": "bookingtime",
"booking_template_id": "template-123",
"appointment_id": "appointment-123",
"organization_id": "organization-123"
}
}
],
"recording_url": "https://example.com/recording.wav",
"sip_status_code": 200,
"sip_status": "OK",
"transfer": null
},
"contact": {
"contact_id": "6bd1e7e0-6d00-4c0b-ad5b-daa72457a27d",
"external_contact_id": "external-123",
"external_url": null,
"created_at": "2024-11-18T15:00:00.000Z",
"gender": null,
"first_name": "Frida",
"last_name": "Kahlo",
"phone_number": "+14155552671",
"in_call_since": null,
"reached_at": "2024-11-18T15:08:52.264Z",
"contact_details": {
"company": "Art Studio Inc"
},
"call_attempts": 1,
"next_call_at": null,
"email": "[email protected]",
"timezone": "America/Los_Angeles",
"salutation": "Ms.",
"status": "reached",
"properties": [
{
"key": "industry",
"value": "retail",
"dataType": "string",
"label": "Industry"
}
]
}
}Events
Anruf beendet
Payload, die telli sendet, wenn ein Anruf einen Endzustand erreicht
WEBHOOK
call_ended
{
"event": "call_ended",
"call": {
"ended_reason": "contact-ended-call",
"call_id": "b4a05730-2abc-4eb0-8066-2e4d23b53ba9",
"loop_id": "ba99c99d-19b9-4a0d-8df6-3e213088989a",
"attempt": 1,
"from_number": "+17755719467",
"direction": "outbound",
"transport": "sip",
"to_number": "+14155552671",
"external_contact_id": "external-123",
"contact_id": "6bd1e7e0-6d00-4c0b-ad5b-daa72457a27d",
"contact_details": {
"company": "Art Studio Inc"
},
"contact_properties": [
{
"key": "industry",
"value": "retail",
"dataType": "string",
"label": "Industry"
}
],
"agent_id": "d8931604-92ad-45cf-9071-d9cd2afbad0c",
"triggered_at": 1731956924302,
"triggered_at_iso": "2024-11-18T15:08:44.302Z",
"started_at": 1731956932264,
"started_at_iso": "2024-11-18T15:08:52.264Z",
"ended_at": 1731957002078,
"ended_at_iso": "2024-11-18T15:10:02.078Z",
"call_length_min": 2,
"call_length_sec": 69,
"call_status": "COMPLETED",
"state": "ended",
"status": "connected",
"follow_up": null,
"transcript": "Agent: Hello...",
"transcriptObject": [
{
"role": "agent",
"content": "Hello..."
},
{
"role": "user",
"content": "Hi, I was hoping to book an appointment."
},
{
"role": "agent",
"toolActivity": "get_available_timeslots",
"type": "function_call"
},
{
"role": "agent",
"content": "I can offer you Thursday at 13:15."
}
],
"call_analysis": {
"appointment": {
"value": true,
"details": "2025-02-18T15:30:00Z"
},
"interest": {
"value": true,
"details": "The customer is interested in buying an ice cream machine"
}
},
"call_outcome": {
"custom_lost_reason": {
"value": "PRODUCT_TOO_EXPENSIVE",
"fieldSchema": {
"type": [
"string",
"null"
],
"enum": [
"CUSTOMER_NOT_INTERESTED",
"CUSTOMER_PREVIOUSLY_CONTACTED",
"PRODUCT_TOO_EXPENSIVE"
]
}
}
},
"collected_data": {
"email": {
"status": "confirmed",
"value": "[email protected]"
},
"delivery_address": {
"status": "confirmed",
"value": "Rosenthaler Straße 51, 10178 Berlin, Germany",
"latitude": 52.5253059,
"longitude": 13.4043936
}
},
"booked_slot_for": "2025-02-24T15:30:00Z",
"appointments": [
{
"id": "c3809aea-0650-461a-ba36-31da19346cd8",
"starts_at": "2025-02-24T15:30:00.000Z",
"timezone": "Europe/Berlin",
"status": "booked",
"hosts": [
{
"name": "Alex Smith",
"email": "[email protected]"
}
],
"reference": {
"provider": "bookingtime",
"booking_template_id": "template-123",
"appointment_id": "appointment-123",
"organization_id": "organization-123"
}
}
],
"recording_url": "https://example.com/recording.wav",
"sip_status_code": 200,
"sip_status": "OK",
"transfer": null
},
"contact": {
"contact_id": "6bd1e7e0-6d00-4c0b-ad5b-daa72457a27d",
"external_contact_id": "external-123",
"external_url": null,
"created_at": "2024-11-18T15:00:00.000Z",
"gender": null,
"first_name": "Frida",
"last_name": "Kahlo",
"phone_number": "+14155552671",
"in_call_since": null,
"reached_at": "2024-11-18T15:08:52.264Z",
"contact_details": {
"company": "Art Studio Inc"
},
"call_attempts": 1,
"next_call_at": null,
"email": "[email protected]",
"timezone": "America/Los_Angeles",
"salutation": "Ms.",
"status": "reached",
"properties": [
{
"key": "industry",
"value": "retail",
"dataType": "string",
"label": "Industry"
}
]
}
}Anrufergebnis
Drei Felder beschreiben, was passiert ist. Auf ihnen solltest du aufbauen:state— wo sich der Anruf in seinem Lebenszyklus befindetstatus— wie er ausgegangen ist, sobald er beendet wurdefollow_up— das von telli geplante Follow-up, falls vorhanden
call_status ist veraltet und wird entfernt. Verwende stattdessen state, status und follow_up.call_status | state | status | follow_up |
|---|---|---|---|
INITIATED | queued | null | null |
RINGING | ringing | null | null |
IN_PROGRESS | in_progress | null | null |
IN_PROGRESS | processing | null | null |
COMPLETED | ended | connected | null |
ANSWERED | ended | connected | gesetzt |
NOT_REACHED | ended | not_connected | null |
NOT_REACHED | ended | redirected | null |
VOICEMAIL | ended | voicemail | null |
ERROR | ended | failed | null |
call_status ist in beide Richtungen verlustbehaftet: IN_PROGRESS unterscheidet nicht zwischen in_progress und processing, und COMPLETED und ANSWERED unterscheiden sich nur darin, ob ein Follow-up geplant wurde.
Analysefelder
call_analysis ist veraltet und bleibt aus Kompatibilitätsgründen verfügbar. Verwende call_outcome für extrahierte Anrufergebnisse. Die beiden Felder haben unterschiedliche Formate.call_analysis enthält die integrierte Analyse von telli. Jeder Eintrag hat einen booleschen value; Einträge, die zusätzliche Details unterstützen, haben außerdem details:
{
"appointment": {
"value": true,
"details": "2025-02-18T15:30:00Z"
}
}
call_outcome enthält die benutzerdefinierten Analysefelder, die du in telli konfigurierst. Die Einträge sind nach Feldnamen benannt und enthalten den extrahierten value sowie das Schema, gegen das er validiert wurde:
{
"custom_lost_reason": {
"value": "PRODUCT_TOO_EXPENSIVE",
"fieldSchema": {
"type": ["string", "null"],
"enum": ["CUSTOMER_NOT_INTERESTED", "CUSTOMER_PREVIOUSLY_CONTACTED", "PRODUCT_TOO_EXPENSIVE"]
}
}
}
call_outcome-Eintrag kann zusätzlich reason enthalten, das erklärt, warum der Agent diesen Wert gewählt hat, sowie error, wenn die Extraktion fehlgeschlagen ist.
Erfasste Daten
Wenn der Agent Datenerfassungs-Aufgaben hat, zeigtcollected_data, was während des Anrufs erfasst und bestätigt wurde:
{
"email": {
"status": "confirmed",
"value": "[email protected]"
},
"delivery_address": {
"status": "confirmed",
"value": "Rosenthaler Straße 51, 10178 Berlin, Deutschland",
"latitude": 52.5253059,
"longitude": 13.4043936
},
"case_number": {
"status": "declined",
"value": null
}
}
confirmed enthalten einen Wert, auf den du dich verlassen solltest. Adresseinträge enthalten zusätzlich latitude und longitude, wenn die Adressvalidierung Koordinaten ermittelt hat; bei anderen Aufgabentypen fehlen diese Felder. Wenn keine Datenerfassungs-Aufgaben konfiguriert sind oder keine ausgelöst wurde, ist collected_data leer oder null — behandle beide Fälle.
Termine
call.appointments enthält die während des Anrufs gespeicherten Buchungen mit Startzeit (starts_at, in UTC), Status, Gastgebern und Anbieterkennungen. Ohne gespeicherte Buchungen ist das Array leer. Fehlgeschlagene Buchungsversuche sind ausgeschlossen.
booked beschreibt die Buchung des Termins, nicht die Bestätigung durch den Kunden. Bei pending steht der Abschluss der Buchung oder die Bestätigung durch den Anbieter noch aus; bei unknown hat die Integration keinen Status gemeldet. Spätere Stornierungen oder Umbuchungen beim Anbieter werden nicht nachgeführt.
call.booked_slot_for ist veraltet und bleibt aus Kompatibilitätsgründen verfügbar. Verwende call.appointments für Buchungsdetails. Bei älteren Anrufen kann call.booked_slot_for gesetzt sein, während call.appointments leer ist.
Aufnahme
recording_url verlinkt auf die Audioaufnahme des Anrufs oder ist null, wenn die Aufnahme deaktiviert oder nicht verfügbar ist. Der Link läuft 1 Stunde nach dem Senden des Webhooks ab — lade die Aufnahme daher sofort herunter, wenn du sie behalten möchtest.
Wiederholungsversuche
Automatische Wiederholungen innerhalb einer geplanten Sequenz teilen sich eineloop_id, und attempt zählt darin hoch. Wird derselbe Kontakt erneut geplant, beginnt eine neue Schleife — verwende daher contact_id, um einen Kontakt über Sequenzen hinweg zu verfolgen.Body
application/json
Antwort
2XX
Acknowledged. Return any 2xx within 15 seconds or the message is retried.
War diese Seite hilfreich?