---
title: "The summary of a call is ready"
method: POST
path: "call.summary.ready"
tags: ["Webhooks"]
---

# The summary of a call is ready

`POST call.summary.ready` (webhook)

We POST this event to every active endpoint subscribed to it (webhook.test only to the endpoint you test). Respond with any 2xx within ten seconds; anything else is retried with backoff for up to 24 hours, in eight attempts. The event id stays the same on retries, so you can skip duplicates.

## Headers

- `Hypamoon-Signature` string, required

## Payload

- CallSummaryReadyEvent: Sent when the summary of a call is ready. Without the transcript: fetch that with GET /calls/{data.call.id}.
  - `id` string, required: The id of the event, evt_ plus 32 hex characters. It stays the same on retries.
  - `type` 'call.summary.ready', required
  - `created_at` string, date-time, required: When the event happened.
  - `data` object, required
    - `call` Call, required: A call. The same shape in GET /calls, GET /calls/{id} and every webhook.
      - `id` string, uuid, required: The id of the call.
      - `direction` 'inbound' | 'outbound' | 'null', nullable, required: inbound, or outbound for a call your assistant made with POST /calls.
      - `from` string, nullable, required: The caller, in E.164.
      - `to` string, nullable, required: The number that was called, in E.164.
      - `status` string, nullable, required: The status as we track it: ringing, active, completed, missed, failed, voicemail, ai_handled. New values may be added; treat an unknown value like completed.
      - `created_at` string, date-time, nullable, required: When the call reached us.
      - `started_at` string, date-time, nullable, required: When the call started.
      - `answered_at` string, date-time, nullable, required: When the platform picked up. With a call plan the platform always picks up first, so this does not prove a person answered.
      - `ended_at` string, date-time, nullable, required: When the call ended.
      - `duration_sec` integer, nullable, required: The length of the call in seconds.
      - `hangup_cause` string, nullable, required: Why the call ended, as reported by the carrier, like normal_clearing.
      - `has_summary` boolean, required: Whether the call has a summary. Fetch it with GET /calls/{id}.
      - `summary_ready_at` string, date-time, nullable, required: When the summary of a recorded call was ready. Empty for a call handled by the voice AI; look at has_summary instead.
      - `test` boolean, required: true for a simulated call from POST /test/calls or POST /calls with a test key (test mode). Also in webhooks, so you can keep test traffic apart.
      - `outbound` object, nullable, required: The request behind an outbound call started with POST /calls.
        - `status` 'queued' | 'ringing' | 'in_progress' | 'completed' | 'failed' | 'no_answer' | 'busy', required: How the outbound call went: queued (not dialled yet), ringing, in_progress (answered), completed, failed, no_answer or busy. An answering machine counts as no_answer, with answered_by machine. Only moves forward.
        - `answered_by` 'human' | 'machine' | 'null', nullable, required: Who picked up, as far as answering machine detection could tell; null when nobody answered or before it is known.
        - `voicemail_left` boolean, required: Whether the assistant left a message on an answering machine.
        - `on_voicemail` 'hangup' | 'leave_message', required: What you asked the assistant to do when an answering machine picks up.
        - `max_duration_sec` integer, required: The cap on the length of the call you asked for, in seconds.
        - `reference` string, nullable, required: Your own reference from POST /calls.
        - `metadata` object, required: Your own metadata from POST /calls.
        - `error` string, nullable, required: With status failed: a short code, like carrier_rejected, assistant_start_failed or unallocated_number. Otherwise null.
        - `purpose` 'transactional' | 'marketing', required: Why the call was made, as sent with POST /calls (transactional when left out). A marketing call was only placed on recorded consent.
    - `summary` Summary, required: The summary of a call.
      - `text` string, nullable, required: The summary in a few sentences.
      - `topics` string[], required: What the call was about.
      - `sentiment` 'positive' | 'neutral' | 'negative' | 'null', nullable, required: The mood of the caller.
      - `action_items` string[], required: What someone has to do after this call.
      - `next_step` string, nullable, required: The agreed next step, if any.

## Acknowledgement `2XX`

Received. Any 2xx counts.

---

[API](https://skmtc.dev/hypamoon/apis/hypamoon-api.md) · [All operations](https://skmtc.dev/hypamoon/apis/hypamoon-api/llms.txt) · [OpenAPI document](https://skmtc.dev/hypamoon/apis/hypamoon-api/revisions/9f0b90004c06?raw)
