An Integration App function (type: "integration_app") runs a built-in action in an app you connected under Settings, Integrations. Tried ships the request code, the argument schema and the error handling for each action, so you do not host an endpoint. Calendar booking (check availability, book, reschedule, cancel) works through these tools.
Needs keys Live actions need the app's credentials. An app connected without credentials runs in Mock mode: actions return deterministic results, and mock bookings are remembered so list, reschedule and cancel behave consistently.
Available actions#
| App | app_type |
Actions | Credentials |
|---|---|---|---|
| Cal.com | cal_com |
cal_com.check_availability, cal_com.book_appointment, cal_com.list_bookings, cal_com.reschedule_booking, cal_com.cancel_booking |
api_key (optional base_url for self-hosted) |
| Calendly | calendly |
calendly.check_availability, calendly.create_scheduling_link |
access_token |
| HubSpot | hubspot |
hubspot.create_contact, hubspot.create_note |
access_token |
| Zendesk | zendesk |
zendesk.create_ticket |
subdomain, email, api_token |
| Salesforce | salesforce |
salesforce.create_contact |
instance_url, access_token |
| Dynamics 365 | dynamics365 |
dynamics365.create_contact |
instance_url, access_token |
| GoHighLevel | gohighlevel |
gohighlevel.create_contact |
access_token, location_id |
| Zoho | zoho |
zoho.create_contact |
access_token |
Action arguments#
| Action | Arguments the LLM fills in (required in bold) |
|---|---|
cal_com.check_availability |
start, end, time_zone |
cal_com.book_appointment |
start, name, email, time_zone, notes |
cal_com.list_bookings |
email |
cal_com.reschedule_booking |
booking_uid, start, reason |
cal_com.cancel_booking |
booking_uid, reason |
calendly.check_availability |
start, end |
calendly.create_scheduling_link |
none |
hubspot.create_contact and every *.create_contact |
phone, first_name, last_name, email |
hubspot.create_note |
contact_id, body |
zendesk.create_ticket |
subject, description, name, email, priority (low, normal, high, urgent) |
Dates are ISO 8601 and time zones are IANA names such as Australia/Sydney.
Step 1: connect the app#
- Go to Settings, Integrations, Apps and click Connect app.
- Pick the App, give it a Name and enter the credentials. Some apps also offer a button to connect with an OAuth account.
- Defaults (JSON) holds per-app settings the actions use. For Cal.com:
{"event_type_id": 123}. For Calendly:{"event_type_uri": "https://api.calendly.com/event_types/..."}. - Click Connect. The app gets an id
app_<24 hex>.
Click an app row to open it: Test connection checks the credentials, Tools for this app lists every action with a Copy tool button (a ready integration_app tool JSON), and Used by shows which agents use it and how many runs failed.
Step 2: add the function#
- Open the agent, expand Functions, click Add and choose Integration App.
- Name and Description: when to run the action, for example "Book the appointment after the caller confirms the slot, their name and their email."
- Pick the App (apps in mock mode show "(test mode)") and the Action.
- Parameters: leave empty to use the action's own schema.
- Static arguments: values always sent, for example
event_type_id. Values can use{{variables}}. - Response variables: name to path in the output, for example
booking_idtobooking.uid. - Output given to the agent: paths to hand to the LLM. Leave empty to give it the whole output.
- Save. The modal needs both an app and an action.
Fields#
| Field | Type | Description |
|---|---|---|
type |
"integration_app" |
|
name, description |
string | |
app_id |
string | app_... from POST /create-app |
action |
string | One of the app's actions |
parameters |
JSON schema object | Optional. Defaults to the action's schema |
static_arguments |
object | Fixed arguments. The LLM's arguments win when both set the same key |
response_variables |
object of name to path | Paths into the action output, like booking.uid or slots[0].start |
output_selection |
string array | Paths handed to the LLM. Empty means the whole output |
timeout_ms |
integer, 1,000 to 120,000 | The worker waits 30,000 ms plus 5 s when unset |
{
"type": "integration_app",
"name": "book_appointment",
"description": "Book the slot the caller chose, after confirming their name and email.",
"app_id": "app_5e0c7a1b2d3f4e5a6b7c8d9e",
"action": "cal_com.book_appointment",
"static_arguments": { "event_type_id": 123 },
"response_variables": { "booking_id": "booking.uid", "booking_start": "booking.start" },
"output_selection": ["booking.start", "booking.status"]
}GET /get-app-tool-schema?app_id=... (or ?app_type=..., optional &action=...) returns the tool schemas for an app, the same ones the Copy tool button copies.
What happens when it runs#
- The worker posts the tool and the LLM's arguments to the API (
/internal/apps/execute). - The API merges
static_argumentsunder the arguments, checks the action belongs to the app, refreshes OAuth tokens if needed, and runs the action (or the mock). - Every run is logged with its request, response, duration and success.
- The output (or the selected paths) is returned as JSON, cut to 15,000 characters.
response_variablesare saved as collected variables. - Vendor errors come back as
Error: <message>to the LLM instead of failing the call. A 401 or 403 from the vendor marks the app's status aserror.
Booking pattern#
A typical booking agent uses three Cal.com functions:
1. Ask which day suits. Call check_availability with that day as start.
2. Offer at most three of the returned slots.
3. Confirm the slot, the caller's full name and email (spell it back).
4. Call book_appointment. Read back the time from the result.Save booking_id from the booking with a response variable so a later reschedule or cancel call can use {{booking_id}}.
Gotchas#
- The LLM must pass dates the vendor understands. Put
{{current_time}}and the time zone in the prompt so it can resolve "next Tuesday". - Keep
output_selectionsmall. A full availability response can be long, and the LLM reads every character. - Mock mode is per app: an app with no credentials stays in mock mode even when the rest of the platform is live.