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.