> ## Documentation Index
> Fetch the complete documentation index at: https://hellotars.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhook event catalogue

> Read the shared event envelope and the data fields for every subscribable event type.

The envelope contains a stable event ID and event-specific data. Times inside data are milliseconds unless marked otherwise.

## Envelope

| Field | Meaning |
| - | - |
| id | Stable evt\_ event ID, reused on replay |
| type | One catalogue type below |
| createdAt | Occurrence time as an ISO 8601 string |
| orgId | Organization ID |
| region | Organization region |
| agent | Originating agent: id, kind and name, or null |
| data | The type-specific object |

Agent kind is chat or voice. Multi-agent conversations also include their agents array inside data.

## Catalogue

| Type | Meaning | Source filter |
| - | - | - |
| conversation.started | A chat starts or a call is answered. | Chat and voice agents |
| conversation.ended | A chat or call ends. Includes the transcript. | Chat and voice agents |
| conversation.analyzed | The summary and analysis are ready. | Chat and voice agents |
| call.transcript\_updated | New lines of a live call. Sent at most every 2 seconds per call. | Voice agents |
| call.transfer\_ringing | A transfer is ringing the other side. | Voice agents |
| call.transfer\_connected | The other side answered a transfer. | Voice agents |
| call.transfer\_bridged | The caller is joined to the other side. | Voice agents |
| call.transfer\_failed | A transfer could not connect. | Voice agents |
| call.transfer\_cancelled | A transfer was stopped before it connected. | Voice agents |
| call.guardrail\_triggered | A guardrail stopped or changed a reply. | Voice agents |
| call.sms\_sent | The agent texted the caller during a call. | Voice agents |
| call.continued\_in\_chat | The caller opened the chat link sent during a call. | Voice agents |
| handoff.requested | The agent asked for a team member. | Chat and voice agents |
| handoff.accepted | A team member took over. | Chat and voice agents |
| handoff.unmet | No team member was available. | Chat and voice agents |
| handoff.completed | The team member finished. | Chat and voice agents |
| campaign.message\_sent | A campaign message left Tars. | Campaigns |
| campaign.message\_delivered | The channel confirmed delivery. | Campaigns |
| campaign.message\_read | The recipient opened the message. | Campaigns |
| campaign.message\_replied | The recipient replied to a campaign message. | Campaigns |
| campaign.message\_failed | The message could not be sent or delivered. | Campaigns |
| campaign.completed | Every message in a scheduled campaign has been sent. | Campaigns |
| contact.created | A new contact was added. | Organization: All resources |
| contact.updated | A contact's details changed. | Organization: All resources |

## Shared data objects

| Object | Fields |
| - | - |
| conversation | id, channel, status, startedAt, endedAt, contactId, campaignId |
| agents | Array of id, kind and name |
| transcript | entries and truncated |
| transcript entry | seq, kind, text, at, optional startMs and endMs |
| ending | reason, by and detail |
| recording | kind, artefactId, url, expiresAt and refreshUrl |
| campaign | id, name and mode |
| contact | id, optional name/email/phone, tags, origin, optional channelIdentifiers and consent, createdAt and lastSeenAt |

endedAt, contactId and campaignId can be null. Transcript entry kind identifies the end user, agent or human responder.

The call object follows the public call representation with privacy protections applied. See [Calls API](https://hellotars.com/docs/developer/api/calls.md).

Recording links follow the call's captured signed-URL policy. expiresAt can be null when time expiry is disabled.

Use refreshUrl to obtain a fresh recording link. Deleting content invalidates existing links and removes available event bodies.

## conversation.started

data contains conversation and agents. Voice starts also include call.

A chat starts when its conversation is created. A voice conversation starts when the call is answered.

## conversation.ended

data contains conversation, agents, ending and transcript. Voice endings can also include call and recordings.

conversation can be null for a refused call that never created a conversation. transcript can be null when unavailable.

ending.reason is resolved, abandoned, superseded or call\_ended. ending.by is agent, system or null. detail is nullable.

## conversation.analyzed

data contains conversation, agents, analysis and run. Voice analysis can also include call and recordings.

analysis contains nullable summary, successful, sentiment and language. sentiment is negative, neutral, positive, unknown or null.

run contains index and rerun. Each completed analysis run has its own event.

## call.transcript\_updated

data contains callId, conversationId and entries. Entries use the shared transcript-entry shape.

Updates are coalesced over two seconds. Entries describe the batch rather than repeating the entire transcript.

## call.transfer\_ringing

data contains call and transfer. transfer contains id, destination, mode and optional failureCode.

The event type identifies ringing, connection, bridging, failure or cancellation.

## call.transfer\_connected

data contains call and transfer. transfer contains id, destination, mode and optional failureCode.

The event type identifies ringing, connection, bridging, failure or cancellation.

## call.transfer\_bridged

data contains call and transfer. transfer contains id, destination, mode and optional failureCode.

The event type identifies ringing, connection, bridging, failure or cancellation.

## call.transfer\_failed

data contains call and transfer. transfer contains id, destination, mode and optional failureCode.

The event type identifies ringing, connection, bridging, failure or cancellation.

## call.transfer\_cancelled

data contains call and transfer. transfer contains id, destination, mode and optional failureCode.

The event type identifies ringing, connection, bridging, failure or cancellation.

## call.guardrail\_triggered

data contains call and guardrail. guardrail contains direction, topics and turnIndex.

## call.sms\_sent

data contains call and sms. sms contains to, body and optional providerMessageId.

## call.continued\_in\_chat

data contains call and continuation. continuation contains conversationId, channel set to web and optional option.

## handoff.requested

data contains conversation, agents, handoff and nullable call.

handoff contains id, channel, origin, reason, status, outcome and destination. origin, reason, outcome and destination can be null.

A destination contains kind set to team\_member, profileId and nullable name. The event type identifies the handoff transition.

## handoff.accepted

data contains conversation, agents, handoff and nullable call.

handoff contains id, channel, origin, reason, status, outcome and destination. origin, reason, outcome and destination can be null.

A destination contains kind set to team\_member, profileId and nullable name. The event type identifies the handoff transition.

## handoff.unmet

data contains conversation, agents, handoff and nullable call.

handoff contains id, channel, origin, reason, status, outcome and destination. origin, reason, outcome and destination can be null.

A destination contains kind set to team\_member, profileId and nullable name. The event type identifies the handoff transition.

## handoff.completed

data contains conversation, agents, handoff and nullable call.

handoff contains id, channel, origin, reason, status, outcome and destination. origin, reason, outcome and destination can be null.

A destination contains kind set to team\_member, profileId and nullable name. The event type identifies the handoff transition.

## campaign.message\_sent

data contains campaign and message. message contains id, contactId, channel, to, requestId, externalMessageId, status and failure.

requestId and externalMessageId can be null. failure is null or an object containing code.

The event type identifies the delivery transition, including sent, delivered, read, replied or failed.

## campaign.message\_delivered

data contains campaign and message. message contains id, contactId, channel, to, requestId, externalMessageId, status and failure.

requestId and externalMessageId can be null. failure is null or an object containing code.

The event type identifies the delivery transition, including sent, delivered, read, replied or failed.

## campaign.message\_read

data contains campaign and message. message contains id, contactId, channel, to, requestId, externalMessageId, status and failure.

requestId and externalMessageId can be null. failure is null or an object containing code.

The event type identifies the delivery transition, including sent, delivered, read, replied or failed.

## campaign.message\_replied

data contains campaign and message. message contains id, contactId, channel, to, requestId, externalMessageId, status and failure.

requestId and externalMessageId can be null. failure is null or an object containing code.

The event type identifies the delivery transition, including sent, delivered, read, replied or failed.

## campaign.message\_failed

data contains campaign and message. message contains id, contactId, channel, to, requestId, externalMessageId, status and failure.

requestId and externalMessageId can be null. failure is null or an object containing code.

The event type identifies the delivery transition, including sent, delivered, read, replied or failed.

## campaign.completed

data contains campaign and completedAt. This event marks completion of a scheduled campaign.

## contact.created

data contains the public end-user record described in the shared objects table.

The initial event waits five seconds. Public updates during that interval fold into the created event.

## contact.updated

data contains the public end-user record and changed. changed lists the public fields that changed.

Updates coalesce over five seconds. Internal bookkeeping changes do not produce this event.

## Tests and exclusions

Test and simulation sessions, historical Tars2 imports, cross-region imports of existing rows and system-only bookkeeping do not produce normal business events.

Normal CSV imports do produce the end-user created event. Tag updates during the initial delay fold into that event.

A destination test uses webhook.test with data containing sampleType and sample. See [Receive events](https://hellotars.com/docs/developer/webhooks/index.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.