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

# Events

Bridge webhooks deliver structured event payloads in JSON format whenever specific actions occur in your workspace.\
Each event follows a consistent schema to make parsing and validation simple.

***

## Common Event Structure

All webhook events share the same top-level structure:

```json theme={null}
{
  "eventId": "string", // Unique event identifier
  "eventType": "string", // Type of event (entity.action)
  "entity": "string", // Entity affected by the event
  "workspaceId": "string", // Your Bridge workspace ID
  "timestamp": "string", // ISO 8601 timestamp
  "payload": {} // Event-specific data
}
```

***

## Conversation Summary Notifications

<button type="button" style={{ display: "inline-block", padding: "3px 12px", borderRadius: "999px", background: "#3b82f6", color: "white", fontSize: "0.7rem", fontWeight: 600, letterSpacing: "0.05em", border: "none", cursor: "pointer", marginTop: "-0.5rem" }}>v1</button>

Triggered once per day, per conversation, when Bridge AI generates the daily summary. The summary captures the key points exchanged along with the internal and external participants involved.

<Tabs>
  <Tab title="Event types">
    | Event Type                     | Description                                |
    | ------------------------------ | ------------------------------------------ |
    | `conversation_summary.created` | A daily conversation summary was generated |
  </Tab>

  <Tab title="Example payload">
    ```json theme={null}
    {
      "eventId": "evt_summary_001",
      "eventType": "conversation_summary.created",
      "entity": "conversation_summary",
      "workspaceId": "ws_123",
      "timestamp": "2026-05-19T05:03:15.910Z",
      "payload": {
        "conversationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "summaryDate": "2026-05-19",
        "summary": "- Advisor asked the customer about their preferred schedule and offered to book a product demo.\n- Customer replied they are unavailable on Monday morning.\n- Advisor offered alternative slots later in the week and is waiting for confirmation.",
        "externalUsers": [
          { "id": "c1d2e3f4-a5b6-7890-cdef-012345678901", "first_name": "Ana", "last_name": "Garcia", "cellphone": "+57300000000" }
        ],
        "internalUsers": [
          { "id": "d4e5f6a7-b8c9-0123-defa-234567890123", "first_name": "Bob", "last_name": "Smith", "cellphone": "+57301000000", "email": "bob.smith@example.com" }
        ],
        "initMessageId": "f1e2d3c4-b5a6-7890-fedc-ba0987654321",
        "endMessageId": "a9b8c7d6-e5f4-3210-abcd-ef9876543210",
        "createdAt": "2026-05-19T05:03:15.910Z",
        "updatedAt": "2026-05-19T05:03:15.910Z"
      }
    }
    ```
  </Tab>
</Tabs>

***

## Task Updates

<button type="button" style={{ display: "inline-block", padding: "3px 12px", borderRadius: "999px", background: "#3b82f6", color: "white", fontSize: "0.7rem", fontWeight: 600, letterSpacing: "0.05em", border: "none", cursor: "pointer", marginTop: "-0.5rem" }}>v1</button>

Triggered when tasks are created or their state changes (status, assignment, reminders).

Payloads vary by event type. The `details` field in the payload describes what changed for that specific event.

<Tabs>
  <Tab title="Event types">
    | Event Type             | Description                                                |
    | ---------------------- | ---------------------------------------------------------- |
    | `task.created`         | A new task was created                                     |
    | `task.status_changed`  | The task status changed (for example, from OPEN to CLOSED) |
    | `task.assigned`        | A user was assigned to the task                            |
    | `task.unassigned`      | A user was unassigned from the task                        |
    | `task.remove_reminder` | A task reminder was removed                                |
    | `task.field_updated`   | A task field was updated                                   |
  </Tab>

  <Tab title="Example payloads">
    <CodeGroup>
      ```json Created theme={null}
      {
        "eventId": "evt_123456789",
        "eventType": "task.created",
        "entity": "task",
        "workspaceId": "ws_123",
        "timestamp": "2026-01-15T10:30:00.000Z",
        "payload": {
          "taskId": "task_123",
          "actorType": "USER",
          "actorId": "user_123",
          "task": {
            "title": "Sample task",
            "description": "Example task description",
            "type": "TASK",
            "priority": "NORMAL",
            "status": "OPEN",
            "sourceType": "MANUAL",
            "dueDate": "2026-01-20T00:00:00.000Z",
            "recurrenceEnded": false,
            "createdAt": "2026-01-15T10:30:00.000Z",
            "updatedAt": "2026-01-15T10:30:00.000Z"
          },
          "assignees": [
            { "assigneeId": "user_456", "assigneeType": "USER" }
          ],
          "conversations": [
            {
              "id": "conv_123",
              "status": "ACTIVE",
              "createdAt": "2026-01-14T09:10:00.000Z",
              "updatedAt": "2026-01-14T09:10:00.000Z"
            }
          ]
        }
      }
      ```

      ```json Assigned theme={null}
      {
        "eventId": "evt_123456790",
        "eventType": "task.assigned",
        "entity": "task",
        "workspaceId": "ws_123",
        "timestamp": "2026-01-15T10:31:00.000Z",
        "payload": {
          "taskId": "task_123",
          "actorType": "USER",
          "actorId": "user_123",
          "details": { "assignee": { "assigneeId": "user_456" } }
        }
      }
      ```

      ```json Unassigned theme={null}
      {
        "eventId": "evt_123456791",
        "eventType": "task.unassigned",
        "entity": "task",
        "workspaceId": "ws_123",
        "timestamp": "2026-01-15T10:32:00.000Z",
        "payload": {
          "taskId": "task_123",
          "actorType": "USER",
          "actorId": "user_123",
          "details": { "assignee": { "assigneeId": "user_456" } }
        }
      }
      ```

      ```json Status changed (open → closed) theme={null}
      {
        "eventId": "evt_123456792",
        "eventType": "task.status_changed",
        "entity": "task",
        "workspaceId": "ws_123",
        "timestamp": "2026-01-15T10:33:00.000Z",
        "payload": {
          "taskId": "task_123",
          "actorType": "USER",
          "actorId": "user_123",
          "details": {
            "statusChange": { "fromStatus": "OPEN", "toStatus": "CLOSED" }
          }
        }
      }
      ```

      ```json Status changed (closed → open) theme={null}
      {
        "eventId": "evt_123456793",
        "eventType": "task.status_changed",
        "entity": "task",
        "workspaceId": "ws_123",
        "timestamp": "2026-01-15T10:34:00.000Z",
        "payload": {
          "taskId": "task_123",
          "actorType": "USER",
          "actorId": "user_123",
          "task": {
            "title": "Sample task",
            "description": "Example task description",
            "type": "TASK",
            "priority": "NORMAL",
            "status": "OPEN",
            "sourceType": "MANUAL",
            "dueDate": "2026-01-20T00:00:00.000Z",
            "recurrenceEnded": false,
            "createdAt": "2026-01-15T10:30:00.000Z",
            "updatedAt": "2026-01-15T10:34:00.000Z"
          },
          "conversations": [
            {
              "id": "conv_123",
              "status": "ACTIVE",
              "createdAt": "2026-01-14T09:10:00.000Z",
              "updatedAt": "2026-01-14T09:10:00.000Z"
            }
          ],
          "details": {
            "statusChange": { "fromStatus": "CLOSED", "toStatus": "OPEN" }
          }
        }
      }
      ```

      ```json Reminder removed theme={null}
      {
        "eventId": "evt_123456794",
        "eventType": "task.remove_reminder",
        "entity": "task",
        "workspaceId": "ws_123",
        "timestamp": "2026-01-15T10:35:00.000Z",
        "payload": {
          "taskId": "task_456",
          "actorType": "USER",
          "actorId": "user_123",
          "details": { "reminder": { "reminderId": "rem_123" } }
        }
      }
      ```

      ```json Field updated theme={null}
      {
        "eventId": "evt_123456795",
        "eventType": "task.field_updated",
        "entity": "task",
        "workspaceId": "ws_123",
        "timestamp": "2026-01-15T10:36:00.000Z",
        "payload": {
          "taskId": "task_123",
          "actorType": "USER",
          "actorId": "user_123",
          "task": {
            "title": "Sample task",
            "description": "Example updated description",
            "type": "TASK",
            "priority": "NORMAL",
            "status": "OPEN",
            "sourceType": "MANUAL",
            "dueDate": "2026-01-20T00:00:00.000Z",
            "recurrenceEnded": false,
            "createdAt": "2026-01-15T10:30:00.000Z",
            "updatedAt": "2026-01-15T10:36:00.000Z"
          },
          "details": {
            "fieldUpdate": { "changedFields": ["description"] }
          }
        }
      }
      ```
    </CodeGroup>
  </Tab>
</Tabs>

***

## Contact Updates

<button type="button" style={{ display: "inline-block", padding: "3px 12px", borderRadius: "999px", background: "#3b82f6", color: "white", fontSize: "0.7rem", fontWeight: 600, letterSpacing: "0.05em", border: "none", cursor: "pointer", marginTop: "-0.5rem" }}>v1</button>

Triggered when contact records are created, updated, or deleted.

<Tabs>
  <Tab title="Event types">
    | Event Type        | Description                  |
    | ----------------- | ---------------------------- |
    | `contact.created` | A new contact was created    |
    | `contact.updated` | A contact record was updated |
    | `contact.deleted` | A contact record was deleted |
  </Tab>

  <Tab title="Example payloads">
    Ownership fields depend on whether the contact is linked to an external CRM:

    * **CRM-synced contacts** carry `crmContactId` and `crmLastSyncedAt` (the contact's identity is owned by the CRM, not by an internal Bridge user).
    * **Bridge-native contacts** (no CRM link) carry `internalUserOwnerId` instead — the Bridge user that owns the record.

    These groups are mutually exclusive: a synced contact will not include `internalUserOwnerId`, and a non-synced contact will not include `crmContactId` or `crmLastSyncedAt`.

    Each entry in `openAttributes` and `closedAttributes` includes a human-readable `name` alongside the `customAttributeId`. For closed attributes, `closedCustomAttributeIds` is an array of `{ id, content }` objects, where `content` is the selected option's display label.

    <CodeGroup>
      ```json CRM-synced theme={null}
      {
        "eventId": "evt_contact_001",
        "eventType": "contact.updated",
        "entity": "contact",
        "workspaceId": "ws_123",
        "timestamp": "2026-01-15T10:30:00.000Z",
        "payload": {
          "id": "contact_123",
          "firstName": "John",
          "lastName": "Doe",
          "email": "john@example.com",
          "cellphone": "+1234567890",
          "languageCode": "EN",
          "openAttributes": [
            {
              "customAttributeId": "attr_open_1",
              "name": "Account Number",
              "content": "14"
            }
          ],
          "closedAttributes": [
            {
              "customAttributeId": "attr_closed_1",
              "name": "Preferred Language",
              "closedCustomAttributeIds": [
                { "id": "opt_1", "content": "ENGLISH" }
              ]
            },
            {
              "customAttributeId": "attr_closed_2",
              "name": "Software Tools",
              "closedCustomAttributeIds": [
                { "id": "opt_2", "content": "Go" },
                { "id": "opt_3", "content": "Postgres" }
              ]
            }
          ],
          "crmContactId": "crm_456",
          "crmLastSyncedAt": "2026-01-10T09:00:00.000Z",
          "createdAt": "2026-01-01T00:00:00.000Z",
          "updatedAt": "2026-01-15T10:30:00.000Z"
        }
      }
      ```

      ```json Bridge-native (no CRM) theme={null}
      {
        "eventId": "evt_contact_002",
        "eventType": "contact.updated",
        "entity": "contact",
        "workspaceId": "ws_123",
        "timestamp": "2026-01-15T10:32:00.000Z",
        "payload": {
          "id": "contact_456",
          "firstName": "Jane",
          "lastName": "Smith",
          "email": "jane@example.com",
          "cellphone": "+1987654321",
          "languageCode": "EN",
          "openAttributes": [
            {
              "customAttributeId": "attr_open_2",
              "name": "Education level",
              "content": "Secondary"
            }
          ],
          "closedAttributes": [
            {
              "customAttributeId": "attr_closed_1",
              "name": "Preferred Language",
              "closedCustomAttributeIds": [
                { "id": "opt_1", "content": "ENGLISH" }
              ]
            },
            {
              "customAttributeId": "attr_closed_3",
              "name": "Gender",
              "closedCustomAttributeIds": [
                { "id": "opt_4", "content": "FEMALE" }
              ]
            }
          ],
          "internalUserOwnerId": "user_789",
          "createdAt": "2026-01-05T15:47:49.000Z",
          "updatedAt": "2026-01-15T10:32:00.000Z"
        }
      }
      ```
    </CodeGroup>
  </Tab>
</Tabs>

***

## Call Notifications

<button type="button" style={{ display: "inline-block", padding: "3px 12px", borderRadius: "999px", background: "#3b82f6", color: "white", fontSize: "0.7rem", fontWeight: 600, letterSpacing: "0.05em", border: "none", cursor: "pointer", marginTop: "-0.5rem" }}>v1</button>

Triggered as a call moves through its lifecycle. Bridge emits at most one webhook per lifecycle phase per call, so your integration receives a clean four-phase timeline (created, ringing, started, finished) rather than every intermediate state transition Bridge writes internally.

The current phase is derivable from the call state and the participants' statuses:

| Phase    | How to detect                                                |
| -------- | ------------------------------------------------------------ |
| created  | state is CREATED and no participant has joined or is ringing |
| ringing  | a participant has status RINGING and nobody has joined yet   |
| started  | state is STARTED and two participants are JOINED             |
| finished | state is FINISHED                                            |

Missed calls (nobody answered) skip the started phase — the integration receives created, ringing, and finished only.

Once a call finishes, Bridge runs the recording through an asynchronous AI transcription pipeline. When the transcript is ready, the integration receives an additional `call.transcription.created` event with the full transcript broken down into time-coded segments per speaker. This event arrives **after** the `call.updated (finished)` event, typically several seconds to a few minutes later depending on call length. Diarization (multi-speaker labelling) depends on the audio source quality — mono recordings may produce a single speaker label for the entire transcript.

<Tabs>
  <Tab title="Event types">
    | Event Type                   | Description                                                 |
    | ---------------------------- | ----------------------------------------------------------- |
    | `call.created`               | A new call was provisioned                                  |
    | `call.updated`               | A call lifecycle phase changed (ringing, started, finished) |
    | `call.transcription.created` | The AI transcript for a finished call is ready              |
  </Tab>

  <Tab title="Example payloads">
    <CodeGroup>
      ```json Created theme={null}
      {
        "eventId": "evt_call_001",
        "eventType": "call.created",
        "entity": "call",
        "workspaceId": "ws_123",
        "timestamp": "2026-05-04T00:48:05.815Z",
        "payload": {
          "callId": "call_abc123",
          "conversationId": "conv_xyz",
          "messageId": "msg_xyz",
          "callType": "ONE_TO_ONE",
          "channelProvider": "WHATSAPP",
          "state": "CREATED",
          "createdAt": "2026-05-04T00:48:05.815Z",
          "updatedAt": "2026-05-04T00:48:05.815Z",
          "participants": {
            "internal": [
              { "userId": "user_internal_1", "name": "Jane Doe", "email": "jane@example.com", "status": "INITIALIZED" }
            ],
            "external": [
              { "userId": "user_external_1", "name": "John Smith", "email": "john@example.com", "status": "INITIALIZED" }
            ]
          }
        }
      }
      ```

      ```json Ringing theme={null}
      {
        "eventId": "evt_call_002",
        "eventType": "call.updated",
        "entity": "call",
        "workspaceId": "ws_123",
        "timestamp": "2026-05-04T00:48:06.243Z",
        "payload": {
          "callId": "call_abc123",
          "conversationId": "conv_xyz",
          "messageId": "msg_xyz",
          "callType": "ONE_TO_ONE",
          "channelProvider": "WHATSAPP",
          "state": "CREATED",
          "createdAt": "2026-05-04T00:48:05.815Z",
          "updatedAt": "2026-05-04T00:48:06.243Z",
          "participants": {
            "internal": [
              { "userId": "user_internal_1", "name": "Jane Doe", "email": "jane@example.com", "status": "INITIALIZED" }
            ],
            "external": [
              { "userId": "user_external_1", "name": "John Smith", "email": "john@example.com", "status": "RINGING" }
            ]
          }
        }
      }
      ```

      ```json Started theme={null}
      {
        "eventId": "evt_call_003",
        "eventType": "call.updated",
        "entity": "call",
        "workspaceId": "ws_123",
        "timestamp": "2026-05-04T00:48:12.771Z",
        "payload": {
          "callId": "call_abc123",
          "conversationId": "conv_xyz",
          "messageId": "msg_xyz",
          "callType": "ONE_TO_ONE",
          "channelProvider": "WHATSAPP",
          "state": "STARTED",
          "startedAt": "2026-05-04T00:48:12.125Z",
          "createdAt": "2026-05-04T00:48:05.815Z",
          "updatedAt": "2026-05-04T00:48:12.771Z",
          "participants": {
            "internal": [
              { "userId": "user_internal_1", "name": "Jane Doe", "email": "jane@example.com", "status": "JOINED", "joinedAt": "2026-05-04T00:48:12.125Z" }
            ],
            "external": [
              { "userId": "user_external_1", "name": "John Smith", "email": "john@example.com", "status": "JOINED", "joinedAt": "2026-05-04T00:48:12.124Z" }
            ]
          }
        }
      }
      ```

      ```json Finished theme={null}
      {
        "eventId": "evt_call_004",
        "eventType": "call.updated",
        "entity": "call",
        "workspaceId": "ws_123",
        "timestamp": "2026-05-04T00:48:20.113Z",
        "payload": {
          "callId": "call_abc123",
          "conversationId": "conv_xyz",
          "messageId": "msg_xyz",
          "callType": "ONE_TO_ONE",
          "channelProvider": "WHATSAPP",
          "state": "FINISHED",
          "startedAt": "2026-05-04T00:48:12.125Z",
          "finishedAt": "2026-05-04T00:48:19.389Z",
          "createdAt": "2026-05-04T00:48:05.815Z",
          "updatedAt": "2026-05-04T00:48:20.113Z",
          "participants": {
            "internal": [
              { "userId": "user_internal_1", "name": "Jane Doe", "email": "jane@example.com", "status": "LEFT", "joinedAt": "2026-05-04T00:48:12.125Z", "leftAt": "2026-05-04T00:48:19.388Z" }
            ],
            "external": [
              { "userId": "user_external_1", "name": "John Smith", "email": "john@example.com", "status": "LEFT", "joinedAt": "2026-05-04T00:48:12.124Z", "leftAt": "2026-05-04T00:48:19.387Z" }
            ]
          }
        }
      }
      ```

      ```json Transcription created theme={null}
      {
        "eventId": "evt_call_005",
        "eventType": "call.transcription.created",
        "entity": "call",
        "workspaceId": "ws_123",
        "timestamp": "2026-05-04T00:50:14.231Z",
        "payload": {
          "callId": "call_abc123",
          "transcriptionId": "txn_xyz789",
          "conversationId": "conv_xyz",
          "duration": "27",
          "startedAt": "2026-05-04T00:48:12.125Z",
          "finishedAt": "2026-05-04T00:48:19.389Z",
          "transcript": [
            { "speaker": "0", "text": "Hi, how can I help you today?", "start": 1.44, "end": 5.2 },
            { "speaker": "1", "text": "I have a question about your product.", "start": 5.5, "end": 12.3 }
          ]
        }
      }
      ```
    </CodeGroup>

    Each transcript segment carries the diarized `speaker` label (typically `"0"`, `"1"`, ...), the `text`, and `start`/`end` offsets in seconds from the call start.
  </Tab>
</Tabs>

***

## Meeting Notifications

<button type="button" style={{ display: "inline-block", padding: "3px 12px", borderRadius: "999px", background: "#3b82f6", color: "white", fontSize: "0.7rem", fontWeight: 600, letterSpacing: "0.05em", border: "none", cursor: "pointer", marginTop: "-0.5rem" }}>v1</button>

Triggered when a meeting reaches the CREATED state. Meeting cancellations are surfaced through the corresponding email notification.

<Tabs>
  <Tab title="Event types">
    | Event Type        | Description                           |
    | ----------------- | ------------------------------------- |
    | `meeting.updated` | A meeting reached the `CREATED` state |
  </Tab>

  <Tab title="Example payload">
    ```json theme={null}
    {
      "eventId": "evt_meeting_001",
      "eventType": "meeting.updated",
      "entity": "meeting",
      "workspaceId": "ws_123",
      "timestamp": "2026-05-04T00:46:40.954Z",
      "payload": {
        "meetingId": "meeting_abc123",
        "conversationId": "conv_xyz",
        "messageId": "msg_xyz",
        "subject": "Meeting with John Smith",
        "providerType": "TEAMS",
        "status": "CREATED",
        "organizerInternalUserId": "user_internal_1",
        "internalParticipants": ["user_internal_1"],
        "externalParticipants": ["user_external_1"],
        "startDateTime": "2026-05-04T01:00:00.000Z",
        "endDateTime": "2026-05-04T01:15:00.000Z",
        "createdAt": "2026-05-04T00:46:29.944Z",
        "updatedAt": "2026-05-04T00:46:40.954Z",
        "provider": {
          "joinUrl": "https://teams.microsoft.com/l/meetup-join/...",
          "calendarEventId": "AAMkADhlMWVlMWJhLWUyZTMtNDllOC...",
          "chatId": "MWM1Zjg4MmUtZjk0Mi00YjJkLTgyNTItNmRiODNiZmM1NWEw",
          "providerMeetingId": "MSowODJkZmFjYy1iNDZmLTRiNDItOGYzOS0xMzI0NDcyMzUwMWUq..."
        }
      }
    }
    ```
  </Tab>
</Tabs>

***

## Email Notifications

<button type="button" style={{ display: "inline-block", padding: "3px 12px", borderRadius: "999px", background: "#3b82f6", color: "white", fontSize: "0.7rem", fontWeight: 600, letterSpacing: "0.05em", border: "none", cursor: "pointer", marginTop: "-0.5rem" }}>v1</button>

Triggered once an email has been processed and the AI summary is available.

The `sentFromBridge` field indicates direction: true for outbound emails sent from the workspace, false for inbound emails received.

<Tabs>
  <Tab title="Event types">
    | Event Type      | Description                           |
    | --------------- | ------------------------------------- |
    | `email.updated` | An email reached the summarized state |
  </Tab>

  <Tab title="Example payload">
    ```json theme={null}
    {
      "eventId": "evt_email_001",
      "eventType": "email.updated",
      "entity": "email",
      "workspaceId": "ws_123",
      "timestamp": "2026-05-04T00:45:31.261Z",
      "payload": {
        "emailId": "email_abc123",
        "conversationId": "conv_xyz",
        "threadId": "AAQkADhlMWVlMWJhLWUyZTMtNDllOC05MDg2LWMzNjFkMTI5MjM4MA...",
        "providerType": "OUTLOOK",
        "status": "PROCESSED",
        "subject": "Project update",
        "sender": "jane@example.com",
        "recipients": [
          { "recipientEmail": "john@example.com" }
        ],
        "summary": "Jane confirms the project is on track and shares next steps.",
        "importance": "NORMAL",
        "sentFromBridge": true,
        "hasAttachments": false,
        "sentAt": "2026-05-04T00:45:09.000Z",
        "createdAt": "2026-05-04T00:45:09.000Z",
        "updatedAt": "2026-05-04T00:45:31.261Z"
      }
    }
    ```
  </Tab>
</Tabs>

***

## Notes

* Bridge may add new event categories in the future.
* Always check the event type field to determine which handler to execute.
* Webhook payloads are versioned — ensure your integration supports the declared version in each event.

***

## Related Topics

* [Overview](/webhooks)
* [Verifying Signatures](/webhooks/verifying-signatures)
* [Console Configuration](/webhooks/configuration)
