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.