> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.formantai.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.formantai.com/_mcp/server.

# Webhook Payloads

> Detailed webhook JSON payload examples and field descriptions.

FormantAI sends signed JSON payloads to every active target subscribed to the event.

## `call.completed`

Sent after the call ends and the conversation is saved.

```json
{
  "event_id": "evt_1c58c5d8c55a",
  "event_type": "call.completed",
  "timestamp": "2026-03-18T20:53:41.766Z",
  "data": {
    "call": {
      "agent_id": 497,
      "call_parameters": {
        "customer_name": "Rahul",
        "loan_id": "LN-12345"
      },
      "conversation_id": "e36853de-9cbb-441e-ad75-d3c8ac82abfb_1",
      "duration_seconds": 142,
      "ended_at": "2026-03-18T20:55:41.766Z",
      "failure_reason": null,
      "from_phone": "+918065177389",
      "recording_url": "https://api.voice.formantai.com/v1/conversations/e36853de-.../recording",
      "started_at": "2026-03-18T20:53:41.766Z",
      "status": "completed",
      "to_phone": "+917014675791",
      "trace_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
    },
    "results": {
      "intent": "payment_confirmed",
      "sentiment": "positive"
    },
    "retry": {
      "attempt_number": 1,
      "is_final_attempt": true,
      "max_attempts": 3,
      "next_retry_at": null
    },
    "retry_context": {
      "collected_data": {
        "customer_name": "Rahul",
        "intent": "payment_confirmed"
      },
      "retry_initial_message": "Hi Rahul, we spoke earlier about your payment.",
      "retry_language": "hi-IN",
      "retry_stage_id": "stage_follow_up"
    },
    "transcript": "BOT: Hello Rahul...\nHUMAN: Yes, I can talk."
  }
}
```

## `call.no_answer`

Sent when the call rang but was not answered.

```json
{
  "event_id": "evt_4f8bf8gbf88d",
  "event_type": "call.no_answer",
  "timestamp": "2026-03-18T20:53:41.766Z",
  "data": {
    "call": {
      "agent_id": 497,
      "call_parameters": { "customer_name": "Rahul" },
      "conversation_id": "e36853de-9cbb-441e-ad75-d3c8ac82abfb_1",
      "duration_seconds": null,
      "ended_at": "2026-03-18T20:54:11.766Z",
      "failure_reason": null,
      "from_phone": "+918065177389",
      "recording_url": null,
      "started_at": "2026-03-18T20:53:41.766Z",
      "status": "no_answer",
      "to_phone": "+917014675791",
      "trace_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
    },
    "results": {},
    "retry": {
      "attempt_number": 2,
      "is_final_attempt": true,
      "max_attempts": 3,
      "next_retry_at": null
    },
    "retry_context": null
  }
}
```

## `call.failed`

Sent when call setup fails or the provider cannot connect the call.

```json
{
  "event_id": "evt_2d69d6e9d66b",
  "event_type": "call.failed",
  "timestamp": "2026-03-18T20:53:41.766Z",
  "data": {
    "call": {
      "agent_id": 497,
      "call_parameters": { "customer_name": "Rahul" },
      "conversation_id": "e36853de-9cbb-441e-ad75-d3c8ac82abfb_1",
      "duration_seconds": null,
      "ended_at": null,
      "failure_reason": "provider_error",
      "from_phone": "+918065177389",
      "recording_url": null,
      "started_at": "2026-03-18T20:53:41.766Z",
      "status": "failed",
      "to_phone": "+917014675791",
      "trace_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
    },
    "results": {},
    "retry": null,
    "retry_context": null
  }
}
```

## Field reference

| Field                        | Description                                                                      |
| ---------------------------- | -------------------------------------------------------------------------------- |
| `data.call.agent_id`         | Agent that handled the call.                                                     |
| `data.call.call_parameters`  | Call-time parameters from API request or CSV row.                                |
| `data.call.conversation_id`  | ID used to fetch the conversation and recording.                                 |
| `data.call.duration_seconds` | Call duration in seconds. Null when the call did not connect.                    |
| `data.call.recording_url`    | API URL to download the recording. Present only when enabled and available.      |
| `data.call.trace_id`         | Trace ID returned by call initiation or generated by the platform.               |
| `data.results`               | Structured outputs extracted by the agent. Shape depends on agent configuration. |
| `data.retry`                 | Retry metadata when a retry strategy evaluated this event.                       |
| `data.retry_context`         | Resume context for future attempts when configured.                              |
| `data.transcript`            | Full conversation text. Present only when enabled and available.                 |

Treat `results` and `call_parameters` as dynamic objects. Store them as JSON so agent changes do not break your ingestion pipeline.