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

# Tool Call Result

> Return a tool's result to the conversation by sending a conversation.tool_result event.

When a tool is delivered via [app message](/sections/conversational-video-interface/pal/llm-tool-delivery#app-message-delivery), your client receives a [`conversation.tool_call`](/sections/event-schemas/conversation-toolcall) event carrying a `tool_call_id`. To return a result, send a `conversation.tool_result` event back with the **matching `tool_call_id`** - that's how Tavus pairs the result with the in-flight dispatch and applies the tool's configured `on_resolve`.

This applies to both **LLM tools** and **Perception tools** delivered via app message.

```json conversation.tool_result (sent by your client) theme={null}
{
  "message_type": "conversation",
  "event_type": "conversation.tool_result",
  "conversation_id": "<conversation_id>",
  "properties": {
    "tool_call_id": "<id from the tool_call event>",
    "output": "It is 72 degrees and sunny in San Francisco.",
    "status": "success"
  }
}
```

| Field          | Type             | Required | Description                                                                                                              |
| -------------- | ---------------- | -------- | ------------------------------------------------------------------------------------------------------------------------ |
| `tool_call_id` | string           | ✅        | Must match the `tool_call_id` from the original `conversation.tool_call` (or `conversation.perception_tool_call`) event. |
| `output`       | string \| object | ❌        | The tool result. Strings are passed through; objects are JSON-serialized.                                                |
| `status`       | string           | ❌        | `"success"` (default) or `"error"`. On `error`, the PAL acknowledges the failure instead of speaking the result.         |

<Note>
  If your client never sends a result, the dispatch eventually drops out of context. There's no hard timeout on this path - the PAL just won't have the data.
</Note>

<Note>
  Perception tools are fire-and-forget by default, so the PAL does not pause for or react to a perception `tool_result`. Sending one is only meaningful when you've changed the tool's `on_resolve` behavior.
</Note>
