An Action is a unit of work your agent can perform on behalf of a user mid-conversation: skip a payment, cancel a card, reorder a card, update a phone number, look up an order. The UI labels this page External Actions, “Set up API calls that your AI agent can perform on behalf of users.”Documentation Index
Fetch the complete documentation index at: https://docs.usefini.com/llms.txt
Use this file to discover all available pages before exploring further.

How Actions relate to the Rulebook
The Rulebook is the brain; Actions are the hands. When the Rulebook walks its tree and reaches a Tool node, it invokes the Action that node points to: The Action owns only the middle: take typed inputs, call your APIs, return typed outputs. Intent matching, input extraction, branching, and the final reply are all the Rulebook’s job. This separation is why an Action’s description doesn’t affect whether it fires, routing is encoded in the tree’s structure, not in the Action.Actions vs Attributes
Both are built on the same Data Steps engine, but they trigger differently:| Attributes | Actions | |
|---|---|---|
| When it runs | Every chat message, automatically. | When a Tool node in the Rulebook fires. |
| Mental model | Context the agent always has. | A unit of work the agent performs on request. |
| Source | Required (UI / Widget / connected integration). | None, Actions are source-agnostic. |
| Shape | Available Data fields with three switches each. | Explicit input and output fields. |
| Typical example | ”Get the customer’s plan and recent orders." | "Cancel the customer’s subscription.” |
Anatomy of an action
The detail view has two tabs: Setup and Data Steps.Setup tab
Two sections, named exactly as the UI labels them:- Required information for this action to run, the input fields. Each field has a name, a type (
string/number/boolean), and arequiredflag. These define the contract the Rulebook must satisfy before invoking the Tool node, typically by placing a Read node upstream (LLM extraction) or referencing context already on the conversation (such as an Attribute). - Data returned after this action runs, the output fields, each with a name and type. These flow back into the tree for downstream Check nodes to branch on, Reply nodes to interpolate, and other Tool nodes to consume as input.

Data Steps tab
The chain of HTTP requests that takes the inputs, calls your APIs, and produces the outputs, the same engine as Attributes’ Data Collection Steps.| Field | What it does |
|---|---|
| Step Name + Method | A label, and the HTTP verb (GET / POST / PUT / PATCH / DELETE). |
| URL | The endpoint. Type $ to insert a dynamic value. |
| Headers / body | JSON. Reference an input field by name with the $ picker, for example, an input field interpolated into the URL, an API key in an Authorization header. |
| Save From Response | The response fields to keep: your field name on the left, the response’s JSON path on the right. |
Field → Gets value from: Step → response field).

Creating an action
Open the Actions page and click New Action
Fill in the basics
- Name (required): an imperative phrase, Skip Smart Save, Cancel Plastic Card, Reorder Physical Card.
- Description: a human-readable summary for teammates browsing the list. It does not trigger the action; routing lives in the Rulebook.

Define the inputs (Setup tab)
required when the action cannot proceed without it. Once the Rulebook routes a conversation here, the LLM extracts these from context (or asks the customer for any required field it can’t find).Define the outputs (Setup tab)
success boolean and a message string.Wire up the Data Steps (Data Steps tab)
$ picker to interpolate input fields into URLs, headers, or bodies. Then, in Connect values to the fields that will be returned, map each output field to a step’s response value.Test before saving
Save, then wire it into the Rulebook
A worked example: cancel subscription
A canonical action. The customer says “I want to cancel my plan”, a Rulebook rule matches the cancellation intent and invokes this action, the action calls your billing API, and a Reply node confirms.Create the action
Define the inputs
Define the outputs
Add the Data Step
POST. URL: the cancellation endpoint on your billing API, with the customerId input interpolated into the path via the $ picker. Headers: an Authorization header carrying your billing token. Body: a JSON object containing reason, interpolated from the input.Save From Response: map the billing API’s response fields to your output names, for example, the billing system’s confirmation_id saves as confirmationId, its refund.amount saves as refundAmount, and its effective_at saves as effectiveDate.Connect values to the returned fields
confirmationId ← Cancel via Billing API → confirmationId, and likewise for refundAmount and effectiveDate.reason = "the product isn't working for us"; a Check node confirms the customer is identified (customerId non-null in context); a Tool node invokes Cancel Subscription; the confirmationId / refundAmount / effectiveDate outputs flow back; a Reply node composes the confirmation. The Action owns only the API call and the typed result, everything else is the Rulebook.
Chaining actions
A single Tool node rarely covers an end-to-end workflow. The common pattern is to chain Tool nodes inside a Sequence, each Tool’s output feeding the next Tool’s input. For example, a refund flow might run:- Lookup Order, input
orderId; outputcustomerId,totalAmount,isRefundable. - Verify Eligibility, input
customerId,totalAmount(from step 1); outputeligible,policyReason. - Submit Refund, input
customerId,amount(=totalAmountfrom step 1); outputrefundId,eta.
eligible == false and route to a Reply node that explains the denial. Because upstream outputs become downstream inputs, define each action’s input/output fields precisely, otherwise downstream nodes can’t see fields they expected, or pass values that don’t match the next Tool’s required types.
Which agents can run an action
Actions live at the workspace level. Unlike Attributes, there is no per-agent attachment, you don’t toggle which agents an action belongs to. An action becomes effective for an agent entirely through the Rulebook. A rule has agent assignments; if a rule is assigned to an agent and its tree contains a Tool node referencing the action, that agent can trigger it. The same action wired into multiple rules is reachable from every agent those rules are assigned to. So when a new action isn’t getting called, the question is “is there a published rule, assigned to the responding agent, with a Tool node pointing at this action?”, not “is this action attached to this agent?”Why an action isn’t being called
No published rule references this action
No published rule references this action
The rule isn't assigned to the responding agent
The rule isn't assigned to the responding agent
The Rulebook branch above the Tool node doesn't match
The Rulebook branch above the Tool node doesn't match
A required input field isn't being supplied
A required input field isn't being supplied
A Data Step is failing
A Data Step is failing
The outputs don't match what your API returns
The outputs don't match what your API returns

