Skip to content
TriedDocs
Integrations

Integration apps

Connect an app once, then give agents integration_app tools that book appointments, create contacts and open tickets during calls and chats.

An integration app is a stored connection to a vendor (Cal.com, Calendly, HubSpot, Zendesk or a CRM) with its credentials and defaults. An integration_app tool on an agent names the app and one action. When the LLM calls the tool, Tried runs the action against the vendor and hands the result back to the conversation.

You do not write any HTTP code: the request shapes, auth headers and error handling are built in.

App types and actions#

app_type Actions Credentials Page
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) Cal.com
calendly calendly.check_availability, calendly.create_scheduling_link access_token Calendly
hubspot hubspot.create_contact, hubspot.create_note access_token HubSpot
zendesk zendesk.create_ticket subdomain, email, api_token Zendesk
salesforce salesforce.create_contact instance_url, access_token Salesforce
dynamics365 dynamics365.create_contact instance_url, access_token Dynamics 365
gohighlevel gohighlevel.create_contact access_token, location_id GoHighLevel
zoho zoho.create_contact access_token Zoho CRM

GET /list-app-types returns this table as JSON (app_type, actions, required_credentials).

Connect an app in the dashboard#

Open Integrations#

Settings, Integrations, Apps, then Connect app.

Choose the app#

Pick the App type and give it a Name (defaults to the type).

Add credentials#

Fill the credential fields, or leave them empty to start in mock mode. For Cal.com, HubSpot, Salesforce, Dynamics 365, Zoho and GoHighLevel you can instead press Connect with ... account to use OAuth.

Set defaults#

Defaults (JSON) holds values every action uses, for example {"event_type_id": 123} for Cal.com or {"event_type_uri": "https://api.calendly.com/event_types/..."} for Calendly.

Connect#

Press Connect. The app appears in the table with its Mode (Mock, connected or error) and its number of Actions.

Click an app to open its detail view:

  • Test connection makes a cheap authenticated read against the vendor and shows the result.
  • Tools for this app lists each action with a Copy tool button that copies a ready-made tool definition.
  • Used by lists the agents whose current LLM or flow uses the app, and the run count with failures.

Add the tool to an agent#

Paste the copied tool into the agent's functions, or build it yourself:

{
  "type": "integration_app",
  "name": "cal_com_book_appointment",
  "description": "Book a Cal.com appointment at a slot returned by check availability.",
  "app_id": "app_1c5e9a3f7b2d6e0a4c8f2b71",
  "action": "cal_com.book_appointment",
  "parameters": {
    "type": "object",
    "properties": {
      "start": { "type": "string", "description": "Slot start, ISO 8601 date-time" },
      "name": { "type": "string", "description": "Attendee full name" },
      "email": { "type": "string", "description": "Attendee email" },
      "time_zone": { "type": "string", "description": "IANA time zone" },
      "notes": { "type": "string", "description": "Anything the host should know" }
    },
    "required": ["start", "name", "email"]
  },
  "static_arguments": { "event_type_id": 1234567 },
  "response_variables": { "booking_uid": "booking.uid" },
  "output_selection": ["booking.uid", "booking.start", "booking.status"],
  "speak_during_execution": true,
  "execution_message_description": "Tell the caller you are booking it now.",
  "timeout_ms": 15000
}
Field Type Description
type string integration_app
name string Tool name the LLM sees. Letters, digits, _ and -, up to 64 characters
description string When the LLM should use it
app_id string The app, prefix app_
action string One of the app type's actions
parameters object JSON schema of the arguments the LLM fills. Defaults to the action's schema from /get-app-tool-schema
static_arguments object Fixed arguments merged under the LLM's arguments. The LLM's value wins on conflict
response_variables object Variable name to JSON path in the action output. The values become dynamic variables for the rest of the call
output_selection string[] JSON paths of the output to hand back to the LLM. Empty means the whole output
timeout_ms integer 1,000 to 120,000
speak_during_execution, speak_after_execution, execution_message_description, execution_message_type, typing_sound The same execution options as every tool type. See Tools

JSON paths use dots and array indexes, for example slots[0].start or booking.uid.

What the LLM receives#

The tool result is JSON of the selected output, cut at 15,000 characters. When the vendor returns an error, the result is {"error": "<message>"} and the tool counts as failed, so the agent can tell the caller. Vendor errors never end the call.

Every run is logged with its arguments, output, error, duration and the call or chat id. Read them in the app detail view or with GET /list-app-usages/:id.

A 401 or 403 from the vendor sets the app's status to error.

Integration apps API#

Create, update and delete need the admin or developer role.

Method and path Purpose
GET /list-app-types App types, actions and required credentials
POST /create-app Create an app. Returns 201
GET /list-apps All apps in the workspace
GET /get-app/:id One app
PATCH /update-app/:id Change name, credentials or config (merged)
DELETE /delete-app/:id Delete an app and its run log. Returns 204
POST /test-app-auth/:id Check the credentials
GET /get-app-tool-schema?app_id= or ?app_type= (optional &action=) Ready-made tool definitions
POST /apps/:id/execute Run an action now, the same way the runtime does
GET /list-app-usages/:id?limit= Agents using the app and recent runs (limit 1 to 200, default 50)

Create an app#

curl -X POST https://api.tried.com.au/create-app \
  -H "Authorization: Bearer $TRIED_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "app_type": "cal_com",
    "name": "Bondi bookings",
    "credentials": { "api_key": "cal_live_..." },
    "config": { "event_type_id": 1234567 }
  }'
Field Type Required Description
app_type string Yes One of the app types
name string No Up to 80 characters. Defaults to the type
credentials object No The type's credential keys. All required keys must be present when you send credentials. Omit for mock mode
config object No Defaults for actions
{
  "app_id": "app_1c5e9a3f7b2d6e0a4c8f2b71",
  "app_type": "cal_com",
  "name": "Bondi bookings",
  "status": "connected",
  "mock": false,
  "credentials": { "api_key": "******f81c" },
  "required_credentials": ["api_key"],
  "config": { "event_type_id": 1234567 },
  "actions": ["cal_com.check_availability", "cal_com.book_appointment", "cal_com.list_bookings", "cal_com.reschedule_booking", "cal_com.cancel_booking"],
  "created_timestamp": 1760690000000,
  "last_modification_timestamp": 1760690000000
}

Run an action#

curl -X POST https://api.tried.com.au/apps/app_1c5e9a3f7b2d6e0a4c8f2b71/execute \
  -H "Authorization: Bearer $TRIED_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"action": "cal_com.check_availability", "arguments": {"start": "2026-10-20", "time_zone": "Australia/Sydney"}}'
{
  "success": true,
  "result": "{\"slots\":[{\"start\":\"2026-10-20T09:00:00+11:00\"},{\"start\":\"2026-10-20T10:00:00+11:00\"}],\"time_zone\":\"Australia/Sydney\"}",
  "output": { "slots": [{ "start": "2026-10-20T09:00:00+11:00" }, { "start": "2026-10-20T10:00:00+11:00" }], "time_zone": "Australia/Sydney" },
  "response_variables": {},
  "error": null,
  "mock": false,
  "duration_ms": 412,
  "app_id": "app_1c5e9a3f7b2d6e0a4c8f2b71",
  "action": "cal_com.check_availability"
}

Pass a tool object (with static_arguments, response_variables, output_selection) in the body to test a tool definition exactly as an agent would run it.

Errors#

Status When
400 Unknown action for the app type, missing credential keys, arguments is not valid JSON
403 Role is not admin or developer (create, update, delete)
404 App not found in this workspace

Vendor errors are not HTTP errors: they return 200 with success: false and error set.

Chat agents#

Chat agents run integration_app tools the same way. The run log stores the chat id in place of a call id.