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

# Actions

> Things an agent can do mid-call beyond talking, including calling your own API and getting an answer back before it replies.

**Actions** are tasks an agent performs during a call rather than after it. Transfer
the call, press a key, hang up, or call your own API and use the answer in the next
sentence.

Actions are created once here and then added to any agent.

***

## The two tabs

**Phone Actions** covers things the agent does to the call itself.

**Custom External Actions** covers calling your own API.

***

## The five types

**Create Action** asks which kind you want.

| Type                                     | What it does                                                                |
| ---------------------------------------- | --------------------------------------------------------------------------- |
| **End Conversation**                     | Configure when the agent should end the call.                               |
| **Transfer Calls**                       | Configure when the agent should transfer the call to another number.        |
| **Use DTMF (Dual Tone Multi-frequency)** | Allow the bot to send keypresses during a call.                             |
| **Custom Input**                         | Trigger your own APIs during a call.                                        |
| **Warm Transfer Calls**                  | Have the agent contact the transfer recipient before transferring the call. |

The first three and the last are phone actions. **Custom Input** is the one that
creates a custom external action.

<Note>
  Several of these overlap with skills. **[Call Routing](./skills/call-routing)**
  and **[End Call](./skills/end-conversation)** cover the same ground with less
  setup. Reach for an action when you need a trigger or a configuration the skill
  does not offer.
</Note>

***

## Building a custom external action

<Frame>
  <img src="https://mintcdn.com/fluents/Ntis-q5QWqwCqRQw/images/product/actions/custom-external-action.jpg?fit=max&auto=format&n=Ntis-q5QWqwCqRQw&q=85&s=2296b443438cace418eae4719c827cc2" alt="The Custom External Actions form showing Speak on Send and Speak on Receive as toggles, Processing Mode, and an input schema property with a live JSON preview" width="1496" height="697" data-path="images/product/actions/custom-external-action.jpg" />
</Frame>

| Field                                    | What it does                                                     |
| ---------------------------------------- | ---------------------------------------------------------------- |
| **What is the action name?**             | A short name. Required.                                          |
| **How should this action be triggered?** | When the agent should use it, in plain language. Required.       |
| **What is the API URL?**                 | The endpoint to call. Required.                                  |
| **Account Connection**                   | A connected account, if the endpoint needs one.                  |
| **Signature Secret**                     | See the warning below.                                           |
| **Speak on Send**                        | Whether the agent may say something before the request goes out. |
| **Speak on Receive**                     | Whether the agent may respond as soon as the result comes back.  |
| **Processing Mode**                      | Muted. This is the only option.                                  |

The trigger question is the important one, and it is not a label. It is what the agent
reads to decide whether this action applies, so write it as a sentence: "If the caller
asks where their order is and has given an order number, look it up."

**Speak on Send** and **Speak on Receive** are toggles, not scripts. You are deciding
whether the agent may speak at those moments, not writing what it says. With both off
the agent goes quiet while the request is in flight, which is what **Muted** means.

<Tip>
  Turn **Speak on Send** on for anything slow. Silence on a phone call reads as a
  dropped connection, and a caller who hears nothing for three seconds starts saying
  "hello?".
</Tip>

***

## The Signature Secret field does nothing

<Warning>
  **Signature Secret** is stored and never used. Nothing in Fluents signs outbound
  requests, so filling this in does not let your endpoint verify that a request came
  from us. Do not treat it as security.

  If you need to authenticate incoming requests, put a secret in the URL path or use
  an **Account Connection**, and treat the endpoint as publicly reachable.
</Warning>

***

## The input schema

The schema is what the agent has to collect before it may call your endpoint.

**Add Property** takes a **Name**, an optional **Description**, a **Type** and a
**Required field** toggle. Types are **String**, **Number** and **Boolean**. There are
no arrays or nested objects.

The JSON preview beside the form updates as you go, so you can see exactly what your
endpoint will receive.

<Tip>
  Descriptions on properties are worth writing. They are how the agent knows what it
  is asking for. "The order number the caller gives, digits only" gets you a cleaner
  value than a bare `order_number`.
</Tip>

The agent collects the required fields through conversation, calls your endpoint, and
uses the response to carry on.

***

## The list

| Column             | What it shows                              |
| ------------------ | ------------------------------------------ |
| **Name**           | The action name, with its type underneath. |
| **Description**    | The trigger text you wrote.                |
| **Action Trigger** | How it fires, such as Function Call.       |
| **Phone Number**   | The number involved, for phone actions.    |

***

## Actions or webhooks

Both send data to a URL you control. The difference is whether the conversation waits.

An **action** happens during the call and the agent uses the answer. A **webhook**
happens after something occurs and nobody is waiting.

If the agent needs to say something based on the response, you want an action. If you
just need your systems to know, you want a **[webhook](./webhook)**.

***

## Where to go next

* Add the action to an agent: **[Agents](/product/features/agent)**
* Notify your systems instead: **[Webhooks](./webhook)**
* Check whether an action ran on a call: **[Calls](/product/features/call)**
