Skip to main content
POST
/
v2
/
tools
Create Tool
curl --request POST \
  --url https://tavusapi.com/v2/tools \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: <api-key>' \
  --data '
{
  "name": "get_weather",
  "description": "Get the current weather for a city",
  "parameters": {
    "type": "object",
    "properties": {
      "city": {
        "type": "string",
        "description": "City name"
      }
    },
    "required": [
      "city"
    ]
  },
  "delivery": {
    "app_message": true
  },
  "trigger_type": "in_call",
  "origin": "llm",
  "on_call": "generate_filler",
  "on_resolve": "generate_response",
  "static_filler": "Sure, let me grab that for you."
}
'
{
  "tool_id": "tabc123def456",
  "owner_id": 3675,
  "name": "get_weather",
  "description": "Get the current weather for a city",
  "parameters": {
    "type": "object",
    "properties": {
      "city": {
        "type": "string",
        "description": "City name"
      }
    },
    "required": [
      "city"
    ]
  },
  "delivery": {
    "app_message": true,
    "api": {
      "url": "https://api.example.com/v1/weather/{city}",
      "method": "POST",
      "timeout": 10,
      "headers": {
        "X-Service": "weather-bot"
      },
      "auth": {
        "token": "<string>",
        "username": "<string>",
        "password": "<string>",
        "name": "X-API-Key",
        "value": "<string>",
        "location": "header",
        "secret": "<string>",
        "token_url": "https://auth.example.com/oauth/token",
        "client_id": "<string>",
        "client_secret": "<string>",
        "scope": "<string>"
      },
      "body_template": {},
      "query_params": {
        "units": "metric"
      },
      "content_type": "application/json"
    }
  },
  "is_system_tool": false,
  "trigger_type": "in_call",
  "origin": "llm",
  "on_call": "generate_filler",
  "on_resolve": "generate_response",
  "static_filler": "Sure, let me grab that for you.",
  "created_at": "2026-05-15T10:30:00",
  "updated_at": "2026-05-15T10:30:00"
}

Authorizations

x-api-key
string
header
required

Body

application/json
name
string
required

Function name the LLM uses to call the tool. Must match OpenAI function-naming rules (letters, digits, underscores; must start with a letter or underscore; max 64 characters) and be unique within your account.

Example:

"get_weather"

description
string
required

Natural-language description used by the LLM to decide when to call the tool. description plus the serialized parameters together must be at most 10000 characters.

Example:

"Get the current weather for a city"

parameters
object

JSON Schema describing the tool's arguments. Follows the standard OpenAI function-calling shape. Property names starting with tavus_ are reserved for Tavus-injected placeholders and are rejected.

Example:
{
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "City name"
}
},
"required": ["city"]
}
delivery
object

How the tool call is dispatched. Exactly one channel must be enabled:

  • app_message: true alone - the call is delivered to your frontend over the Daily data channel as a conversation.tool_call event.
  • api set with app_message: false - Tavus makes an HTTPS request to api.url.

If delivery is omitted on create, the default is { "app_message": true }.

trigger_type
enum<string>
default:in_call

When the tool runs. in_call (default) offers the tool during the live conversation. post_call runs once after the conversation ends; omit origin and set delivery.api (HTTPS webhook). See Post-Call Actions.

Available options:
in_call,
post_call
Example:

"in_call"

origin
enum<string> | null
default:llm

Live modality for in-call tools only. Required when trigger_type is in_call (defaults to llm). Must be omitted or null for post_call tools.

Available options:
llm,
vision,
audio
Example:

"llm"

on_call
enum<string> | null
default:generate_filler

What the PAL does while the tool call is in flight. generate_filler (default for llm tools) lets the LLM speak a contextual filler line. static_filler plays the static_filler string verbatim. silent says nothing. passthrough skips filler entirely. Must be null for perception tools.

Available options:
generate_filler,
static_filler,
silent,
passthrough
Example:

"generate_filler"

on_resolve
enum<string> | null
default:fire_and_forget

what the PAL does after the tool returns. generate_response re-prompts the LLM with the result so it can answer naturally. response_in_result speaks the response text returned by your endpoint verbatim. add_to_context silently adds the result to conversation context. fire_and_forget ignores the result. Perception tools must use fire_and_forget.

Available options:
generate_response,
response_in_result,
add_to_context,
fire_and_forget
Example:

"generate_response"

static_filler
string | null

Phrase the PAL speaks while the tool call is in flight. Required when on_call is static_filler; must be null for perception tools.

Example:

"Sure, let me grab that for you."

Response

Tool created

A standalone tool definition. Returned by every tool endpoint and embedded in the data array of the PAL-tool endpoints.

tool_id
string

Unique identifier for the tool. System tools use their name as the tool_id (e.g. end_call).

Example:

"tabc123def456"

owner_id
integer | null

Internal user ID that owns the tool. null for built-in system tools.

Example:

3675

name
string

Function name the LLM uses to call the tool.

Example:

"get_weather"

description
string

Natural-language description of the tool.

Example:

"Get the current weather for a city"

parameters
object

JSON Schema describing the tool's arguments.

Example:
{
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "City name"
}
},
"required": ["city"]
}
delivery
object

How the tool call is dispatched. Exactly one channel must be enabled:

  • app_message: true alone - the call is delivered to your frontend over the Daily data channel as a conversation.tool_call event.
  • api set with app_message: false - Tavus makes an HTTPS request to api.url.

If delivery is omitted on create, the default is { "app_message": true }.

is_system_tool
boolean

Whether this is a built-in system tool. System tools cannot be modified or deleted.

Example:

false

trigger_type
enum<string>

When the tool runs. post_call tools execute server-side after the conversation ends via delivery.api (HTTPS webhook).

Available options:
in_call,
post_call
Example:

"in_call"

origin
enum<string> | null

Live modality for in-call tools. Null for post-call tools.

Available options:
llm,
vision,
audio
Example:

"llm"

on_call
enum<string> | null

What the PAL does while the tool call is in flight. Always null for perception tools.

Available options:
generate_filler,
static_filler,
silent,
passthrough
Example:

"generate_filler"

on_resolve
enum<string> | null

What the PAL does after the tool returns.

Available options:
generate_response,
response_in_result,
add_to_context,
fire_and_forget
Example:

"generate_response"

static_filler
string | null

Phrase the PAL speaks while the tool call is in flight. Set when on_call is static_filler.

Example:

"Sure, let me grab that for you."

created_at
string

ISO 8601 timestamp of when the tool was created.

Example:

"2026-05-15T10:30:00"

updated_at
string

ISO 8601 timestamp of when the tool was last updated.

Example:

"2026-05-15T10:30:00"