Skip to content
TriedDocs
Functions and tools

Integration tools

Book appointments, check calendars and create CRM records and tickets during a call with Integration App functions for Cal.com, Calendly, HubSpot, Zendesk, Salesforce, Dynamics 365, GoHighLevel and Zoho.

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#

  1. Go to Settings, Integrations, Apps and click Connect app.
  2. Pick the App, give it a Name and enter the credentials. Some apps also offer a button to connect with an OAuth account.
  3. 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/..."}.
  4. Click Connect. The app gets an id app_<24 hex>.
Connected apps under Settings, Integrations, with Mock mode shown for apps without credentials

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#

  1. Open the agent, expand Functions, click Add and choose Integration App.
  2. Name and Description: when to run the action, for example "Book the appointment after the caller confirms the slot, their name and their email."
  3. Pick the App (apps in mock mode show "(test mode)") and the Action.
  4. Parameters: leave empty to use the action's own schema.
  5. Static arguments: values always sent, for example event_type_id. Values can use {{variables}}.
  6. Response variables: name to path in the output, for example booking_id to booking.uid.
  7. Output given to the agent: paths to hand to the LLM. Leave empty to give it the whole output.
  8. 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#

  1. The worker posts the tool and the LLM's arguments to the API (/internal/apps/execute).
  2. The API merges static_arguments under the arguments, checks the action belongs to the app, refreshes OAuth tokens if needed, and runs the action (or the mock).
  3. Every run is logged with its request, response, duration and success.
  4. The output (or the selected paths) is returned as JSON, cut to 15,000 characters. response_variables are saved as collected variables.
  5. 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 as error.

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_selection small. 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.