Skip to content
TriedDocs
Integrations

Create app

Connect an integration app such as Cal.com, HubSpot, Calendly or Zendesk so agents can call it as a tool.

POSThttps://api.tried.com.au/create-app

Needs keys Live actions need the vendor's API key or token, or an OAuth connection from Start OAuth. Without credentials the app runs in mock mode and its actions return sample data.

Creates an integration app in the workspace. An integration_app tool on an LLM or flow then names the app by app_id and picks one of its actions. See Integrations for the dashboard flow.

Request#

Field Type Required Description
app_type string Yes One of cal_com, hubspot, calendly, zendesk, salesforce, dynamics365, gohighlevel, zoho.
name string No Display name, 1 to 80 characters. Defaults to the app_type.
credentials object or null No String values, each up to 4000 characters. When set, it must hold every key in the type's required_credentials (see List app types). base_url is optional for every type. Omit it or pass null to create the app in mock mode.
config object No Defaults for actions. Cal.com reads event_type_id, Calendly reads event_type_uri. Defaults to {}.

Credentials are encrypted at rest and are write-only: responses show the key names with masked values.

Example request#

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": "Sydney clinic bookings",
    "credentials": { "api_key": "cal_live_0123456789abcdef7c1e" },
    "config": { "event_type_id": 1048576 }
  }'
const res = await fetch("https://api.tried.com.au/create-app", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.TRIED_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    app_type: "cal_com",
    name: "Sydney clinic bookings",
    credentials: { api_key: process.env.CALCOM_API_KEY },
    config: { event_type_id: 1048576 },
  }),
});
const app = await res.json();
import os, requests

res = requests.post(
    "https://api.tried.com.au/create-app",
    headers={"Authorization": f"Bearer {os.environ['TRIED_API_KEY']}"},
    json={
        "app_type": "cal_com",
        "name": "Sydney clinic bookings",
        "credentials": {"api_key": os.environ["CALCOM_API_KEY"]},
        "config": {"event_type_id": 1048576},
    },
)
app = res.json()

Response#

201 Created

{
  "app_id": "app_6f1c2a9e4b7d3058a1e2c4f9",
  "app_type": "cal_com",
  "name": "Sydney clinic bookings",
  "status": "connected",
  "mock": false,
  "credentials": { "api_key": "******7c1e" },
  "required_credentials": ["api_key"],
  "config": { "event_type_id": 1048576 },
  "actions": [
    "cal_com.check_availability",
    "cal_com.book_appointment",
    "cal_com.list_bookings",
    "cal_com.reschedule_booking",
    "cal_com.cancel_booking"
  ],
  "created_timestamp": 1792390000000,
  "last_modification_timestamp": 1792390000000
}
Field Type Description
app_id string ID to reference in an integration_app tool.
status string connected or error. New apps start as connected. It becomes error when Test app auth fails, a live action gets a 401 or 403 from the vendor, or an OAuth refresh fails.
mock boolean true when the app has no credentials, holds tokens from the mock OAuth provider, or the server runs with TRIED_MOCK_PROVIDERS=1. Mock actions return deterministic sample data.
credentials object or null Key names with masked values: six asterisks plus the last 4 characters. Keys ending in url and non-secret keys (subdomain, location_id, email, api_domain, expires_at, token_type, scope, tenant and the oauth markers) are shown in full. null when no credentials are set.
required_credentials string[] Credential keys this app type needs.
actions string[] Actions you can run with this app.

Errors#

Status When
400 Body fails validation (for example an unknown app_type), or credentials lacks a required key, for example cal_com needs api_key.
401 Missing or invalid API key.
403 The key's IP allowlist or scopes reject the request. This route needs the admin scope. Dashboard users need the admin or developer role (Requires role: admin or developer).
429 Rate limit exceeded. See Rate limits.

See Errors for the body format.

Retell compatibility#

Same path and method as Retell, but the body differs. Retell takes type, provider, auth_config and crm_config. Tried takes app_type, credentials and config, and returns app_type and status where Retell returns type, provider and connection_status.