---
title: "Call outcome webhook"
method: POST
path: "Campaign Call Outcome"
tags: ["Webhooks"]
---

# Call outcome webhook

`POST Campaign Call Outcome`

## Request

- Base URL: `https://app.freyavoice.ai/api/v2`
- URL: `https://app.freyavoice.ai/api/v2/Campaign Call Outcome`
- Auth: none declared

Sent to the campaign's webhookUrl when a call completes or fails.

**Payload Types:**
- **WebhookCallOutcome**: Sent when a call completes (success or failure with ended_reason)
- **WebhookApiError**: Sent when call initiation fails before a call is created

**Failure Categories:**
- `no_answer`: Customer didn't answer
- `busy`: Line was busy
- `voicemail`: Reached voicemail
- `timeout`: Call timed out (infrastructure)
- `api_error`: API call failed before call started
- `llm_fail`: LLM evaluation failed (if successPrompt configured)
- `other`: Unknown failure

**Retry Behavior:**
- If `willRetry: true`, check `retryScheduledAt` for next attempt time
- Retries respect the campaign's schedule (activeDays, startTime, endTime)
- `retriesRemaining` shows how many retries are left

## Request body

- WebhookCallOutcome
  - `callId` string
  - `campaignId` string, required
  - `phoneNumber` string, required
  - `outcome` 'success' | 'failed', required
  - `failureCategory` string: SipCodeCategory value or 'api_error' if outcome is 'failed'
  - `message` string: Contextual message: ended_reason, timeout message, or LLM evaluation reason
  - `willRetry` boolean: Whether the call will be retried
  - `retryScheduledAt` string, date-time: ISO8601 timestamp when retry is scheduled
  - `retriesRemaining` number: Number of retries remaining
  - `attemptNumber` number: Which attempt this outcome is for (1-indexed)

## Response `200`

Webhook received successfully

---

[API](https://skmtc.dev/freyavoice/apis/freyavoice-api.md) - [All operations](https://skmtc.dev/freyavoice/apis/freyavoice-api/llms.txt) - [OpenAPI document](https://skmtc.dev/freyavoice/apis/freyavoice-api/revisions/153d120f0c73?raw)
