LLM and perception tools are surfaced to you as events to run yourself during the call. A post-call action is the opposite: it runs once, after the conversation ends, and Tavus delivers it for you - no client-side handling required.
How It Works
When a conversation ends, for each post-call action attached to the PAL:- Tavus reads the conversation transcript and perception analysis.
- An AI step fills the action’s open arguments from that context - the fields you describe.
- Any fixed values you set are used exactly as provided.
- Tavus delivers an HTTPS request to your configured webhook endpoint.
A post-call action needs a transcript to work from, so it won’t run for a conversation with no dialogue.
Defining a Post-Call Action
A post-call action is a tool you create with the Tools API, with three things set:| Field | Type | Required | Description |
|---|---|---|---|
trigger_type | string | ✅ | Set to "post_call" so the tool runs after the conversation ends (rather than the default "in_call"). |
origin | string | - | Leave unset. origin is the live modality (llm, vision, audio) for in-call tools; post-call actions have no live modality. |
parameters | object | ✅ | A JSON Schema object describing the action’s arguments (see below). |
delivery | object | ✅ | How the action is sent when it runs (see Delivery). Uses the standard tool delivery field. |
Parameters
Each parameter is either fixed or AI-filled:| Kind | How to define it | Behavior |
|---|---|---|
| Fixed value | Set a const on the parameter (e.g. a Slack channel ID). | Tavus uses it exactly as provided. The AI never changes it. |
| AI-filled | Leave the parameter open with a clear description. | Tavus writes it from the transcript and perception analysis when the action runs. |
Delivery
A post-call action uses the standard tooldelivery field with delivery.api only. App-message delivery doesn’t apply once the call is over.
Configure delivery.api with a URL, HTTP method, headers, body_template, and any auth. Tavus sends one HTTPS request to that endpoint when the action runs. See Tool Delivery for the request shape, URL templating, and response handling.
Example Configuration
A post-call action that posts a one-line summary to your backend.channel is pinned with a const; message is written by the AI from the transcript and perception analysis, and body_template maps both onto the request body. See the Tools API reference for the full request and Tool Delivery for the delivery model.
Create a post-call action
Observing Results
Thedelivery.api.url above is where the action fires - Tavus’s outbound request carrying your body_template. To see whether it actually ran and how it went, Tavus emits an application.post_call_action_executed event for each action it runs (one per attached post-call action), independent of how your endpoint responded.
The event’s properties record the outcome:
| Field | Description |
|---|---|
tool_id / tool_name | Which action ran. |
status | success, error, timeout, or skipped. |
request | What Tavus sent: url, method, body. |
response | What your endpoint returned: http_status, body. |
error | Present only on failure - the error detail. |
- Webhook - it’s delivered to the conversation’s
callback_url, alongside the other conversation events. Branch onevent_type == "application.post_call_action_executed". - Pull - it’s also returned on the verbose GET conversation response under
events, so you can reconcile after the fact without running a webhook server.
application.post_call_action_executed
Attaching to a PAL
A post-call action runs for a PAL once you attach it, like any other tool - see Attach Tools to a PAL. Once attached, it runs after every conversation with that PAL.Replace
<api-key> with your actual API key when calling the Tools API. You can generate one in the PAL Maker.
