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

# call.completed

> Sent when a conversation ends.

The main event. It arrives once the conversation is over, with everything that was
worked out during the call.

```json theme={null}
{
  "id": "4f3c1e8a9b2d4c7e8f1a2b3c4d5e6f70",
  "type": "call.completed",
  "created_at": "2026-10-02T09:14:21.481000+00:00",
  "message": {
    "type": "end-of-call-report",
    "phoneNumber": { "number": "+4930999999" },
    "customer": { "number": "+4930111111" },
    "contact": {
      "id": 1182,
      "externalId": "",
      "firstName": "Jana",
      "lastName": "Albrecht",
      "displayName": "Jana Albrecht",
      "phoneNumber": "+4930111111",
      "email": "jana.albrecht@example.com",
      "timezone": "Europe/Berlin",
      "properties": { "tier": "gold" }
    },
    "summary": "The guest moved a reservation from the 14th to the 21st.",
    "recordingUrl": null,
    "endedReason": "customer-ended-call",
    "durationSeconds": 126,
    "messages": [
      { "role": "assistant", "content": "Elster Hotels, how can I help?" },
      { "role": "user", "content": "I need to move my booking." }
    ],
    "analysis": {
      "summary": "The guest moved a reservation from the 14th to the 21st.",
      "durationSeconds": 126,
      "structuredData": { "needs_follow_up": false, "room_type": "double" }
    }
  }
}
```

## Fields

| | |
| - | - |
| `phoneNumber.number` | The number that was called, or called from |
| `customer.number` | The other person's number |
| `contact` | The matched [contact](/contacts). `{}` for a withheld number. Your custom properties are under `properties`. |
| `summary` | A written summary of the call |
| `durationSeconds` | How long it ran |
| `messages` | The conversation, in order |
| `analysis.structuredData` | Your [outcomes](/outcomes), keyed by name |
| `endedReason` | How the call finished |

<Warning>
  `recordingUrl` is usually `null` here. The call ends before the audio file is
  finished, so subscribe to
  [`recording.ready`](/api-reference/webhooks/recording-ready) to get the
  recording.
</Warning>

## Using it

This is the event to write into your CRM. `analysis.structuredData` is already the
shape you want — named fields with real values — so you can map it to your own
fields without parsing the transcript.

Match the person on `contact.externalId` if you set one when creating the contact,
or on `customer.number` otherwise.


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