# Trillet AI - Complete Documentation
> This file contains the complete documentation for Trillet AI.
> Total pages: 150
---
## Introduction
*Starter project with example pages, components, and auto-deploy from GitHub. Edit MDX files, customize your theme, and go live in minutes.*
Welcome to your documentation site. This starter project has everything you need to get up and running.
## What's included
Example pages showing how to structure your docs with headings, lists, and components.
Cards, callouts, tabs, steps, and more — all ready to use.
Push to GitHub and your docs build and deploy automatically.
Change colors, logo, navigation, and theme in `docs.json`.
## Next steps
Learn how to edit pages, customize your site, and deploy changes.
---
## Quickstart
*Edit MDX files, add new pages to your navigation, customize colors and branding in docs.json, and preview locally with the Jamdesk CLI.*
Your docs are built from MDX files in this repository. Every push to GitHub triggers an automatic build and deploy.
## Edit a page
Open any `.mdx` file and start writing. MDX supports standard Markdown plus Jamdesk components.
```mdx
---
title: My Page
description: A brief description for SEO
---
# Heading
Regular markdown works — **bold**, *italic*, `code`, [links](https://example.com).
```
## Add a new page
Add a new `.mdx` file anywhere in your project, for example `guides/deployment.mdx`.
Open `docs.json` and add the page path to the `navigation` section:
```json
{
"group": "Guides",
"pages": ["guides/deployment"]
}
```
Commit and push. Your site will rebuild automatically.
## Customize your site
Everything is configured in `docs.json`:
| Setting | What it does |
|---------|-------------|
| `name` | Site name shown in the header |
| `colors` | Primary, light, and dark accent colors |
| `logo` | Light and dark mode logo images |
| `theme` | Visual theme (`jam`, `nebula`, or `pulsar`) |
| `navigation` | Sidebar tabs, groups, and page order |
| `navbar` | Top navigation links and buttons |
See the full configuration reference at [jamdesk.com/docs](https://jamdesk.com/docs).
## Use the CLI
Install the Jamdesk CLI for local development:
```bash
npm install -g jamdesk
```
Preview your docs locally:
```bash
jamdesk dev
```
This starts a local server with hot reload so you can see changes instantly.
---
## Callouts
*Draw attention to important information with Note, Tip, Warning, Danger, and Check callouts. Supports custom titles and rich Markdown content.*
Callouts draw attention to key information.
## Types
Helpful context or additional information.
Best practices or optimization suggestions.
Important caveats or requirements.
Critical warnings — actions that could cause data loss.
Success confirmations or completed steps.
## Usage
```mdx
Helpful context or additional information.
Important caveats or requirements.
```
## With custom title
You can use **Markdown** inside callouts, including `code` and [links](/introduction).
```mdx
You can use **Markdown** inside callouts.
```
---
## Cards
*Create linked feature grids and navigation panels with Card and Columns components. Supports icons, descriptions, and click-through links.*
## Basic card
A simple card with a title and content.
```mdx
A simple card with a title and content.
```
## Card with icon
Add an icon for visual emphasis.
```mdx
Add an icon for visual emphasis.
```
## Card with link
Cards can link to other pages.
```mdx
Cards can link to other pages.
```
## Card group
Use `Columns` to arrange cards in a grid:
Documentation
API Reference
Tutorials
Get help
```mdx
DocumentationAPI Reference
```
## Properties
The title displayed at the top of the card.
Font Awesome icon name (e.g., "book", "code", "rocket").
URL the card links to.
---
## Steps
*Break multi-step processes into numbered instructions with Steps and Step components. Each step gets a title and supports rich content.*
Use Steps for ordered instructions:
```bash
npm install -g jamdesk
```
```bash
jamdesk init
```
Open your project and create `.mdx` files. Each file becomes a page in your docs.
## Usage
```mdx
Description of what to do.
Next instruction.
```
Steps work well for setup guides, tutorials, and getting-started flows.
---
## Tabs & Accordions
*Organize content with Tabs for language or platform variants and AccordionGroup for collapsible FAQ-style sections that save vertical space.*
## Tabs
Show content in switchable panels:
```jsx
function App() {
return
Hello React
;
}
```
```html
Hello Vue
```
```html
Hello Svelte
```
```mdx
Content for the React tab.
Content for the Vue tab.
```
## Accordions
Collapsible sections for optional details:
Jamdesk is a documentation platform that builds and hosts your docs from MDX files in a GitHub repository.
Push to GitHub. Jamdesk builds and deploys automatically on every push.
Yes. Configure your custom domain in the Jamdesk dashboard under project settings.
```mdx
Answer here.
```
---
## Introduction
*Example section for showcasing API endpoints*
If you're not looking to build API reference documentation, you can delete
this section by removing the api-reference folder.
## Welcome
There are two ways to build API documentation: [OpenAPI](https://mintlify.com/docs/api-playground/openapi/setup) and [MDX components](https://mintlify.com/docs/api-playground/mdx/configuration). For the starter kit, we are using the following OpenAPI specification.
View the OpenAPI specification file
## Authentication
All API endpoints are authenticated using Bearer tokens and picked up from the specification file.
```json
"security": [
{
"bearerAuth": []
}
]
```
---
## Trillet Change Log
*View the latest changes to Trillet*
---
## API Best Practices
*Guidelines for integrating with Trillet AI API*
## Authentication
### API Keys
- Keep your API keys secure and never expose them in client-side code
- Use different API keys for development and production
- Rotate your API keys periodically
- Monitor your API key usage for suspicious activity
```bash
# API Key format
xxxxxxxxxxxxxxxxxxx
```
## Error Handling
Implement proper error handling for API responses:
```bash
curl -X POST https://api.trillet.ai/api/v1/calls/send \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"agentId": "agent_123",
"toNumber": "+1234567890"
}'
```
Common error responses:
```json
{
"error": {
"code": "insufficient_credits",
"message": "Your account has insufficient credits"
}
}
```
```json
{
"error": {
"code": "invalid_number",
"message": "The provided phone number is invalid"
}
}
```
## Rate Limits
- Production API keys are limited to 60 requests per minute
- Implement backoff when you hit rate limits
- Monitor your API usage in the dashboard
Rate limit response:
```json
{
"error": {
"code": "rate_limit_exceeded",
"message": "Too many requests. Please try again in 60 seconds.",
"reset_at": "2024-01-22T15:30:00Z"
}
}
```
## Webhooks [Coming Soon!]
### Configuring Webhooks
1. Add your webhook URL in the dashboard
2. Configure the events you want to receive
3. Store your webhook secret securely
### Verifying Webhooks
Always verify webhook signatures using the `X-Trillet-Signature` header:
```bash
# Your webhook secret from the dashboard
WEBHOOK_SECRET=whsec_xxxxxxxxxxxxx
# Verify the signature before processing webhooks
echo -n "$PAYLOAD" | openssl sha256 -hmac "$WEBHOOK_SECRET"
```
### Webhook Events
- `call.started` - When a call begins
- `call.completed` - When a call ends
- `call.failed` - When a call fails
- `sms.sent` - When an SMS is sent
- `sms.delivered` - When an SMS is delivered
Example webhook payload:
```json
{
"event": "call.completed",
"data": {
"callId": "call_xyz789",
"agentId": "agent_123abc",
"duration": 125,
"status": "completed"
}
}
```
## Production Checklist
1. **Authentication**
- Use production API keys
- Implement key rotation
- Secure key storage
2. **Error Handling**
- Handle all error codes
- Implement retry logic
- Log errors appropriately
3. **Monitoring**
- Track API response times
- Monitor error rates
- Set up alerts
4. **Webhooks**
- Use HTTPS endpoints
- Verify signatures
- Implement retry logic
- Handle duplicate events
## Need Help?
Check our API status and uptime
Get technical support
---
## Webhook Integration Guide [Coming Soon]
## Introduction
This guide will help you integrate and set up webhooks for inbound AI-powered calls. It explains how to configure webhook settings, set up an API receiver, and dynamically replace variables in AI-generated prompts.
## Prerequisites
Before you begin, make sure you have:
- An account for your application.
- A valid URL to handle webhook calls.
## Configure Webhook Settings
To get started, set up your webhook URL, headers, and query parameters.
- Enter your webhook URL
- Add your API authentication details, such as bearer tokens or API keys.
- Include any dynamic parameters you wish to pass, such as customer_name and order_status.

## Create an API Receiver
- Create an API endpoint to process incoming webhook requests.
```bash
app.get('/get-webhook', (req, res) => {
console.log("Request Headers: ", req.headers);
console.log("Request Query: ", req.query);
// Respond with variables for AI prompt
res.status(200).json({
variables: {
customer_name: "John Doe",
order_status: "shipped"
}
});
});
```
Note: The API response should always include the variables object in the following format:
```bash
{
"variables": {
"customer_name": "John Doe",
"order_status": "shipped"
}
}
```
## Replace Variable in AI Prompts
Use the returned variables from your webhook to dynamically update AI prompts.
Example Prompt in Call Flow Designer:
```bash
Hello, {{customer_name}}, your order status is {{order_status}}.
```
When the webhook processes the request, variables are replaced dynamically:
```bash
Hello, John Doe, your order status is shipped.
```
---
## documentation/introduction

## Transform Customer Interactions with AI
Trillet AI provides a powerful REST API to create human-like voice and messaging experiences at scale. Our platform combines state-of-the-art language models with advanced voice synthesis to enable natural conversations across multiple channels.
Set up your first agent in minutes!
Explore our comprehensive API documentation
## Core Features
Create and manage conversational call agents with unique voices and personalities through our REST API
Create and manage messaging AI agents with unique through our REST API
Design and control call & conversation flows programmatically
Design and control call & conversation flows programmatically
Initiate and manage voice calls via REST endpoints
Design and control customer interactions through conversations programmatically
## Getting Started
1. Sign up for an API key at [app.trillet.ai](https://app.trillet.ai)
2. Follow our [Quick Start Guide](/documentation/quickstart) to make your first API call
3. Explore our [API Reference](/v1/api-reference/introduction) for detailed endpoint documentation
## Resources
Complete API reference
API integration guidelines
Get technical help
---
## On-Premise Deployment
*Run Trillet in Your Own Infrastructure*
## On-Premise Deployment: Run Trillet in Your Own Infrastructure
Trillet is now available for on-premise deployment. For enterprises that need complete control over where their data lives, you can run our full voice AI platform within your own infrastructure.
**Trillet is the only voice AI orchestration and application platform in Australia offering on-premise deployment.**
## Why On-Premise?
### Data Sovereignty
Customer conversations never leave your controlled environment. For Australian companies operating under strict regulatory requirements, this simplifies compliance and gives your security team full visibility over where sensitive data resides.
### Privacy
Voice interactions contain highly personal information. On-premise deployment ensures that customer calls, account details, and sensitive data stay within your perimeter, not traversing third-party networks.
### Compliance
Whether you're navigating APRA CPS 234, HIPAA, or internal security policies, on-premise deployment provides the audit trail and control you need to satisfy regulators and stakeholders.
### Performance
Running locally eliminates network latency to external providers, delivering faster response times for your customers.
## What's Included
Trillet ships as a Docker container that includes our complete platform: the orchestration layer, API management, and management UI. You're not just getting an inference engine, you're getting the full application.
**Bring your own providers.** Trillet orchestrates your choice of TTS, LLM, and telephony components, including on-premise models from providers that offer them. You control the stack.
## Who It's For
On-premise deployment is designed for Australian enterprises with strict data sovereignty requirements. If your security policies require that customer voice data stays within infrastructure you control, or if you operate in regulated industries where compliance demands are high, on-premise is for you.
## Still Fully Managed
On-premise doesn't mean DIY. Our team handles deployment, configuration, updates, and ongoing support. You get the compliance posture of on-premise with the operational simplicity of a managed service.
## Get Started
To discuss on-premise deployment for your organisation, [contact our sales team](https://cal.com/forms/1feb42e7-a4b2-4cd3-8076-18ea016b1a2f).
---
## documentation/platform-integrations
## Trillet AI Integrations
Trillet AI offers seamless integration with popular automation tools like **Make.com**, **n8n**, and our **Web SDK**, allowing you to automate **outbound AI voice calls** and embed **AI agents directly into your applications**. Use these platforms and tools to trigger TrilletAI's call capabilities directly from your workflows or integrate voice agents into your websites.
---
## Make.com Integration
Integrate Trillet AI with Make.com **custom node** to automate **outbound voice call workflows**. This is ideal for building call-based campaigns, customer notifications, or voice follow-ups powered by Trillet AI.
### Installation
To add TrilletAI's app to your Make.com organization:
You can find TrilletAI directly on Make.com by searching **"TrilletAI"** in the App list under the `us1` or `us2` regions.
If TrilletAI does not appear in your region or account, use the invitation link below to add it manually:
🔗 **[Click here to install](https://www.make.com/en/hq/app-invitation/380f3212527664bd958eb3bf383c97fe)** if it doesn't appear.
## n8n Integration
TrilletAI provides a **custom node** for [n8n](https://n8n.io) to let you trigger **outbound voice calls** directly within your workflows. This allows you to automate call-based sequences based on custom events, user actions, or external system triggers.
### Installation Steps
1. Ensure `n8n` is installed on your machine. If not, follow [n8n installation guide](https://docs.n8n.io/).
2. Open your terminal and install the TrilletAI node package:
```bash
npm install n8n-trillet-nodes
```
---
## SDK Integration
The Trillet AI Web SDK allows you to integrate **AI-powered voice agents** directly into your website or web application. This enables users to interact with your Trillet AI agents via voice or text calls, ideal for embedding real-time AI conversations in client-facing apps, demos, or custom workflows. The SDK uses LiveKit for real-time audio handling and supports features like transcription, audio analysis, and event emitting.
### Installation
You can install the SDK via npm for modern web frameworks (e.g., React, Next.js) or load it directly from a CDN for simple HTML integrations.
#### Via npm
1. Install the package:
```bash
npm install @trillet-ai/web-sdk
```
2. Import and use in your code:
```typescript
import { TrilletAgent } from '@trillet-ai/web-sdk';
```
#### Via CDN (No Build Tools Required)
Include the SDK script in your HTML:
```html
```
**Note:** The SDK requires a browser environment with secure context (HTTPS or localhost). It does not support server-side rendering.
### Configuration
Initialize a `TrilletAgent` instance:
```typescript
const agent = new TrilletAgent({
workspaceId: 'your-workspace-id',
agentId: 'your-agent-id',
variables: { key: 'value' },
mode: 'voice',
});
```
### Usage
1. **Start a Call:**
- Use `startPublicCall()` for public (workspace-based) integrations.
- Use `startCall()` for API key authenticated calls.
```typescript
try {
await agent.startPublicCall();
console.log('Call started');
} catch (error) {
console.error('Failed to start call:', error);
}
```
2. **End a Call:**
```typescript
agent.endCall();
```
3. **Toggle Microphone:**
```typescript
agent.toggleMicrophone(true); // Enable microphone
```
4. **Event Handling:**
The SDK extends `EventEmitter`. Listen for events like `connected`, `disconnected`, `error`, `assistantStartedSpeaking`, etc.
```typescript
agent.on('connected', (details) => {
console.log('Connected:', details.callId, details.agent.name);
});
agent.on('disconnected', () => {
console.log('Call ended');
});
agent.on('error', (error) => {
console.error('Error:', error);
});
```
5. **Transcripts:**
Access real-time and final transcripts:
```typescript
const transcripts = agent.getTranscripts(); // Array of Transcript objects
const current = agent.getCurrentTranscript(); // Partial transcripts
```
### SDK Integration Preview
**Important:** Make sure to enable public access in your call flow settings before testing the SDK integration. You can find this option in the call flow settings panel.
### Examples
#### React Component Integration
For React/Next.js apps, create a basic component to handle calls:
```tsx
import { useState, useRef } from 'react';
import { TrilletAgent } from '@trillet-ai/web-sdk';
const VoiceAgent = ({ agentId, workspaceId }) => {
const agentRef = useRef(null);
const [isCallActive, setIsCallActive] = useState(false);
if (!agentRef.current) {
agentRef.current = new TrilletAgent({
workspaceId,
agentId,
});
}
const startCall = async () => {
try {
await agentRef.current.startPublicCall();
setIsCallActive(true);
} catch (error) {
console.error('Failed to start call:', error);
}
};
const endCall = () => {
agentRef.current.endCall();
setIsCallActive(false);
};
return (
);
};
export default VoiceAgent;
```
#### Simple HTML Button Integration
Embed a button that starts/stops a voice call with your agent:
```html
```
**Note:** Replace placeholders like `your-workspace-id` and `your-agent-id` with your actual Trillet AI credentials. For production, secure sensitive data (e.g., avoid exposing API keys client-side). The SDK handles browser compatibility checks internally. If you encounter issues, ensure microphone permissions are granted and test in a secure context.
---
## Quickstart Guide
*Complete guide to setting up your first AI agent in Trillet - from creating call flows to handling live calls*
This handbook walks you through setting up your first AI agent in Trillet. From creating call flows to assigning numbers and handling live calls, you'll learn each step to get your agent running smoothly.
**Ready to scale beyond the basics?** Our platform supports complete white-label customization - imagine your own branded domain, custom email notifications, and workspaces that reflect your unique brand identity. Perfect for agencies and enterprises looking to offer AI voice solutions under their own name. [Explore Whitelabel](https://app.trillet.ai/settings) to unlock unlimited branding possibilities.
Looking for advanced whitelabel features? Our [Exclusive Whitelabel Guide](https://app.trillet.ai/) contains premium strategies and configurations - available exclusively to Whitelabel subscribers.
## Getting Started
Once you sign in, you'll land on your Home Page. To build an AI agent, the first step is creating a Call Flow.
1. **Access the Side Panel**: Hover over and click the Trillet logo. This will open the Side Panel.
2. **Navigate the Interface**: From the Side Panel, you can navigate to all sections of the Trillet interface. Each section has its own functionality, which we'll explore as we move through this handbook.
3. **Start with Flow Studio**:
- In the Side Panel, click **Flow Studio**
- This will open a dropdown menu with two options: [Call Flows](/v1/api-reference/endpoints/flows/call-flows/create) and [Message Flows](/v1/api-reference/endpoints/flows/message-flows/create)
4. **Choose Your Flow Type**: Trillet lets you create both, depending on your use case. In this module, we'll start with a Call Flow.
### Understanding Call Flows
A Call Flow is the backbone of your AI agent. It defines how conversations are structured and whether your agent will handle one-way or two-way communication. You can think of it like a blueprint for your agent's calls.
After navigating to Call Flows, your dashboard will look like this:
- As you create call flows, they'll appear here for quick access
- You can also add personal folders to keep your work organized
To begin building your first flow, click the **Create New Flow** button.
## 1.1 Create a Call Flow from Scratch
Trillet gives you the ability to customize your agent and choose how it communicates with users.
On this page, you'll set the foundation for your AI agent by giving it a name, defining its purpose, and selecting the right call direction, voice, and language model. Think of this as your agent's "identity card" - the details you set here define how it looks, sounds, and behaves during conversations.
### Configuration Steps
**Select Folder**
- Choose the folder where you want to save this call flow
- Organizing flows into folders helps keep your workspace tidy
**Enter Flow Information**
- **Flow Title**: Give your call flow a descriptive name (e.g., Sales Demo Flow)
- **Description**: Add a short explanation of what this flow is for (optional, but useful if you have multiple flows)
- **Call Direction**:
- **Outbound Only**: one-way outgoing calls without return calls
- **Outbound & Inbound**: two-way conversations where the agent can also receive calls
Select the option that matches your use case.
**Configure Your Agent**
- **Agent Name**: Assign a name to your agent. This is how it will appear across your workspace
- **Language Model**: Select the AI model that powers your agent's responses (see [Call Agents API](/v1/api-reference/endpoints/agents/call/create) for available models)
- **Voice Options**: Choose from available voices:
- Trillet AI Voices (default, included)
- ElevenLabs Voices (premium, additional cost)
- BYO ElevenLabs (bring your own ElevenLabs account) [You will need to ensure that you have added the voices to your ElevenLabs account first under 'My Voices' and that the necessary privileges are provided to the API key.]
- **Flow Generator**: Trillet gives you the ability to turn an existing call recording into a ready-to-use call flow
Once you've filled in the details, click **Next** (bottom right) to move on to prompting your agent.
## 1.2 Prompting Your Agent
The way you prompt your agent determines how well it performs during conversations. Think of it like giving instructions to a teammate before they step into a meeting - the clearer and more specific you are, the better they'll handle the interaction.
You can also choose how your agent starts off the call — whether that's waiting for the caller to speak first, using an AI-generated greeting that adapts to context, or delivering a custom greeting you've written yourself.
### Writing Effective Prompts
A strong prompt usually includes:
- **A clear goal** → what is the agent trying to achieve on this call?
- **Background context** → who is the agent, and what key details should they know?
- **Conversation flow** → the step-by-step path the agent should follow to reach the goal
### Using the Prompt Template
To make this easier, Trillet provides a prompt template you can follow. Instead of starting from scratch, the template gives you a ready-made structure that covers all the essentials: defining your agent's role, setting formatting rules, and mapping out the conversation flow.
**Example Prompt Structure:**
If your agent's goal is to qualify leads for a demo, your prompt might:
- Set the goal as confirming interest and booking a demo slot
- Provide background context like "You are Alex, a friendly sales assistant from Acme Software"
- Outline a conversation flow where the agent greets the lead, confirms their availability, and suggests two demo times
### Testing Your Agent
You can test your agent through both **Voice Chat** and **Text Chat**. **Voice Chat** lets you experience how it sounds in a live call, while **Text Chat** makes it easy to review responses in writing. Both methods allow you to fine-tune your prompt and improve the agent's performance.
When you're ready to test, click the **Save & Test Agent** button in the top-right corner of the prompt editor.
You can test your agent through both **Voice Chat** and **Text Chat**:
- **Voice Chat** lets you experience how it sounds in a live call
- **Text Chat** makes it easy to review responses in writing
Both methods allow you to fine-tune your prompt and improve the agent's performance.
It's always a good idea to test your prompt with different variations to see what gives you the most natural results.
## 1.3 Assigning a Phone Number
When you're ready to take your AI agent live, it needs a phone number that people can call. Assigning a number is what connects your agent to the outside world, allowing it to handle real conversations instead of just test runs.
### Number Options
Trillet gives you two options:
**1. Buy a New Number**
- Purchase directly through the platform
- Quick setup and ready to use right away
- Search by country, type (local or toll-free), state, or area code
**2. Bring Your Own Number**
- Link an existing number from providers like Twilio
- Keep using your existing carrier rates
- Manage everything from within Trillet
### Number Assignment
Once you have a number, you can assign it to your AI agent:
Configuration options include:
- Choose whether to assign to a call or message flow
- Select the agent it should connect with
- Enable call recording
- Add metadata tags for dynamic interactions
### Next Steps After Assignment
Once your number is linked, you can configure:
- Maximum call duration
- Call recording settings
- Business hours
- Call or Message flow assignment
When everything is configured, your number is live and ready. Make a quick test call to confirm everything works as expected.
## 1.4 Sending and Receiving Calls
Once a phone number is assigned to your AI agent, you can configure how it handles incoming and outgoing calls.
### Single Calls
To assign a single number: go to **Sidebar → Calls → Single Call**
Simply select the agent you want to map the number to (the same agent you assigned the phone number to) and enter the number where you'd like to receive the calls.
You can also use our [Voice Calls API](/v1/api-reference/endpoints/calls/initiate-call) to programmatically initiate calls:
```bash
curl -X POST https://api.trillet.ai/api/v1/calls/send \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"agentId": "your_agent_id",
"toNumber": "+1234567890",
"fromNumber": "your_assigned_number"
}'
```
### Batch Calls
Trillet also gives you the ability to place batch calls. To access this feature: **Sidebar → Calls → Batch Calls**
Batch Calls let you reach multiple contacts at once instead of dialing them individually. This is especially helpful for:
- Lead reactivation campaigns
- Appointment reminders
- Survey collection
- Follow-up calls
**Setup Process:**
1. Select an agent
2. Upload a CSV file with contact details
3. Schedule when the calls should go out
4. Review past batches under "View History" to track performance
For large-scale operations, consider using our [Batch Calls API](/v1/api-reference/endpoints/calls/batch/overview) to programmatically manage batch calls and monitor their status.
## 1.5 Setting up Transfers
Transfers let your agent hand a call over to a real person or another system when needed. This is useful for situations where the conversation requires human support, a specialized team, or a different department.
### Transfer Setup Steps
1. **Click Add New Transfer**
2. **Enter a friendly name** (e.g., Support Team)
3. **Select the transfer type**
4. **Choose the destination type** (Phone Number/SIP Address or Phone Metadata Tags)
5. **Enter the destination** in the valid format:
- Phone: `+12025550123`
- SIP: `sip:user@domain.com`
6. **Save your transfer** - your agent will now know where to route calls when triggered
### Transfer Types
- **Warm Transfer**: Agent stays on the line during handoff
- **Cold Transfer**: Agent immediately transfers and disconnects
Make sure to test your transfer destinations to ensure they're properly configured and accessible.
## API Integration
Throughout this guide, we've focused on the visual interface, but every feature is also available through our comprehensive REST API:
Create and manage conversational agents programmatically
Design conversation flows via API
Initiate and manage calls programmatically
Handle real-time conversations
## Next Steps
Now that you've set up your first AI agent, explore these advanced features:
Scale your implementation with whitelabel tools
Track performance and optimize your agents
Learn advanced prompting techniques for better conversations
Connect your agent to external systems
## Support & Resources
Complete API reference and examples
Join our developer community
Get a support plan for direct technical help and guidance
---
## Code Blocks
*Display inline code and code blocks*
## Basic
### Inline Code
To denote a `word` or `phrase` as code, enclose it in backticks (`).
```
To denote a `word` or `phrase` as code, enclose it in backticks (`).
```
### Code Block
Use [fenced code blocks](https://www.markdownguide.org/extended-syntax/#fenced-code-blocks) by enclosing code in three backticks and follow the leading ticks with the programming language of your snippet to get syntax highlighting. Optionally, you can also write the name of your code after the programming language.
```java HelloWorld.java
class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
```
````md
```java HelloWorld.java
class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
```
````
---
## Images and Embeds
*Add image, video, and other HTML elements*
## Image
### Using Markdown
The [markdown syntax](https://www.markdownguide.org/basic-syntax/#images) lets you add images using the following code
```md

```
Note that the image file size must be less than 5MB. Otherwise, we recommend hosting on a service like [Cloudinary](https://cloudinary.com/) or [S3](https://aws.amazon.com/s3/). You can then use that URL and embed.
### Using Embeds
To get more customizability with images, you can also use [embeds](/writing-content/embed) to add images
```html
```
## Embeds and HTML elements
Mintlify supports [HTML tags in Markdown](https://www.markdownguide.org/basic-syntax/#html). This is helpful if you prefer HTML tags to Markdown syntax, and lets you create documentation with infinite flexibility.
### iFrames
Loads another HTML page within the document. Most commonly used for embedding videos.
```html
```
---
## Markdown Syntax
*Text, title, and styling in standard markdown*
## Titles
Best used for section headers.
```md
## Titles
```
### Subtitles
Best use to subsection headers.
```md
### Subtitles
```
Each **title** and **subtitle** creates an anchor and also shows up on the table of contents on the right.
## Text Formatting
We support most markdown formatting. Simply add `**`, `_`, or `~` around text to format it.
| Style | How to write it | Result |
| ------------- | ----------------- | --------------- |
| Bold | `**bold**` | **bold** |
| Italic | `_italic_` | _italic_ |
| Strikethrough | `~strikethrough~` | ~strikethrough~ |
You can combine these. For example, write `**_bold and italic_**` to get **_bold and italic_** text.
You need to use HTML to write superscript and subscript text. That is, add `` or `` around your text.
| Text Size | How to write it | Result |
| ----------- | ------------------------ | ---------------------- |
| Superscript | `superscript` | superscript |
| Subscript | `subscript` | subscript |
## Linking to Pages
You can add a link by wrapping text in `[]()`. You would write `[link to google](https://google.com)` to [link to google](https://google.com).
Links to pages in your docs need to be root-relative. Basically, you should include the entire folder path. For example, `[link to text](/writing-content/text)` links to the page "Text" in our components section.
Relative links like `[link to text](../text)` will open slower because we cannot optimize them as easily.
## Blockquotes
### Singleline
To create a blockquote, add a `>` in front of a paragraph.
> Dorothy followed her through many of the beautiful rooms in her castle.
```md
> Dorothy followed her through many of the beautiful rooms in her castle.
```
### Multiline
> Dorothy followed her through many of the beautiful rooms in her castle.
>
> The Witch bade her clean the pots and kettles and sweep the floor and keep the fire fed with wood.
```md
> Dorothy followed her through many of the beautiful rooms in her castle.
>
> The Witch bade her clean the pots and kettles and sweep the floor and keep the fire fed with wood.
```
### LaTeX
Mintlify supports [LaTeX](https://www.latex-project.org) through the Latex component.
8 x (vk x H1 - H2) = (0,1)
```md
8 x (vk x H1 - H2) = (0,1)
```
---
## Navigation
*The navigation field in mint.json defines the pages that go in the navigation menu*
The navigation menu is the list of links on every website.
You will likely update `mint.json` every time you add a new page. Pages do not show up automatically.
## Navigation syntax
Our navigation syntax is recursive which means you can make nested navigation groups. You don't need to include `.mdx` in page names.
```json Regular Navigation
"navigation": [
{
"group": "Getting Started",
"pages": ["quickstart"]
}
]
```
```json Nested Navigation
"navigation": [
{
"group": "Getting Started",
"pages": [
"quickstart",
{
"group": "Nested Reference Pages",
"pages": ["nested-reference-page"]
}
]
}
]
```
## Folders
Simply put your MDX files in folders and update the paths in `mint.json`.
For example, to have a page at `https://yoursite.com/your-folder/your-page` you would make a folder called `your-folder` containing an MDX file called `your-page.mdx`.
You cannot use `api` for the name of a folder unless you nest it inside another folder. Mintlify uses Next.js which reserves the top-level `api` folder for internal server calls. A folder name such as `api-reference` would be accepted.
```json Navigation With Folder
"navigation": [
{
"group": "Group Name",
"pages": ["your-folder/your-page"]
}
]
```
## Hidden Pages
MDX files not included in `mint.json` will not show up in the sidebar but are accessible through the search bar and by linking directly to them.
---
## Reusable Snippets
*Reusable, custom snippets to keep content in sync*
import SnippetIntro from '/snippets/snippet-intro.mdx';
## Creating a custom snippet
**Pre-condition**: You must create your snippet file in the `snippets` directory.
Any page in the `snippets` directory will be treated as a snippet and will not
be rendered into a standalone page. If you want to create a standalone page
from the snippet, import the snippet into another file and call it as a
component.
### Default export
1. Add content to your snippet file that you want to re-use across multiple
locations. Optionally, you can add variables that can be filled in via props
when you import the snippet.
```mdx snippets/my-snippet.mdx
Hello world! This is my content I want to reuse across pages. My keyword of the
day is {word}.
```
The content that you want to reuse must be inside the `snippets` directory in
order for the import to work.
2. Import the snippet into your destination file.
```mdx destination-file.mdx
---
title: My title
description: My Description
---
import MySnippet from '/snippets/path/to/my-snippet.mdx';
## Header
Lorem impsum dolor sit amet.
```
### Reusable variables
1. Export a variable from your snippet file:
```mdx snippets/path/to/custom-variables.mdx
export const myName = 'my name';
export const myObject = { fruit: 'strawberries' };
```
2. Import the snippet from your destination file and use the variable:
```mdx destination-file.mdx
---
title: My title
description: My Description
---
import { myName, myObject } from '/snippets/path/to/custom-variables.mdx';
Hello, my name is {myName} and I like {myObject.fruit}.
```
### Reusable components
1. Inside your snippet file, create a component that takes in props by exporting
your component in the form of an arrow function.
```mdx snippets/custom-component.mdx
export const MyComponent = ({ title }) => (
{title}
... snippet content ...
);
```
MDX does not compile inside the body of an arrow function. Stick to HTML
syntax when you can or use a default export if you need to use MDX.
2. Import the snippet into your destination file and pass in the props
```mdx destination-file.mdx
---
title: My title
description: My Description
---
import { MyComponent } from '/snippets/custom-component.mdx';
Lorem ipsum dolor sit amet.
```
---
## Global Settings
*Mintlify gives you complete control over the look and feel of your documentation using the mint.json file*
Every Mintlify site needs a `mint.json` file with the core configuration settings. Learn more about the [properties](#properties) below.
## Properties
Name of your project. Used for the global title.
Example: `mintlify`
An array of groups with all the pages within that group
The name of the group.
Example: `Settings`
The relative paths to the markdown files that will serve as pages.
Example: `["customization", "page"]`
Path to logo image or object with path to "light" and "dark" mode logo images
Path to the logo in light mode
Path to the logo in dark mode
Where clicking on the logo links you to
Path to the favicon image
Hex color codes for your global theme
The primary color. Used for most often for highlighted content, section
headers, accents, in light mode
The primary color for dark mode. Used for most often for highlighted
content, section headers, accents, in dark mode
The primary color for important buttons
The color of the background in both light and dark mode
The hex color code of the background in light mode
The hex color code of the background in dark mode
Array of `name`s and `url`s of links you want to include in the topbar
The name of the button.
Example: `Contact us`
The url once you click on the button. Example: `https://mintlify.com/docs`
Link shows a button. GitHub shows the repo information at the url provided including the number of GitHub stars.
If `link`: What the button links to.
If `github`: Link to the repository to load GitHub information from.
Text inside the button. Only required if `type` is a `link`.
Array of version names. Only use this if you want to show different versions
of docs with a dropdown in the navigation bar.
An array of the anchors, includes the `icon`, `color`, and `url`.
The [Font Awesome](https://fontawesome.com/search?q=heart) icon used to feature the anchor.
Example: `comments`
The name of the anchor label.
Example: `Community`
The start of the URL that marks what pages go in the anchor. Generally, this is the name of the folder you put your pages in.
The hex color of the anchor icon background. Can also be a gradient if you pass an object with the properties `from` and `to` that are each a hex color.
Used if you want to hide an anchor until the correct docs version is selected.
Pass `true` if you want to hide the anchor until you directly link someone to docs inside it.
One of: "brands", "duotone", "light", "sharp-solid", "solid", or "thin"
Override the default configurations for the top-most anchor.
The name of the top-most anchor
Font Awesome icon.
One of: "brands", "duotone", "light", "sharp-solid", "solid", or "thin"
An array of navigational tabs.
The name of the tab label.
The start of the URL that marks what pages go in the tab. Generally, this
is the name of the folder you put your pages in.
Configuration for API settings. Learn more about API pages at [API Components](/api-playground/demo).
The base url for all API endpoints. If `baseUrl` is an array, it will enable for multiple base url
options that the user can toggle.
The authentication strategy used for all API endpoints.
The name of the authentication parameter used in the API playground.
If method is `basic`, the format should be `[usernameName]:[passwordName]`
The default value that's designed to be a prefix for the authentication input field.
E.g. If an `inputPrefix` of `AuthKey` would inherit the default input result of the authentication field as `AuthKey`.
Configurations for the API playground
Whether the playground is showing, hidden, or only displaying the endpoint with no added user interactivity `simple`
Learn more at the [playground guides](/api-playground/demo)
Enabling this flag ensures that key ordering in OpenAPI pages matches the key ordering defined in the OpenAPI file.
This behavior will soon be enabled by default, at which point this field will be deprecated.
A string or an array of strings of URL(s) or relative path(s) pointing to your
OpenAPI file.
Examples:
```json Absolute
"openapi": "https://example.com/openapi.json"
```
```json Relative
"openapi": "/openapi.json"
```
```json Multiple
"openapi": ["https://example.com/openapi1.json", "/openapi2.json", "/openapi3.json"]
```
An object of social media accounts where the key:property pair represents the social media platform and the account url.
Example:
```json
{
"x": "https://x.com/mintlify",
"website": "https://mintlify.com"
}
```
One of the following values `website`, `facebook`, `x`, `discord`, `slack`, `github`, `linkedin`, `instagram`, `hacker-news`
Example: `x`
The URL to the social platform.
Example: `https://x.com/mintlify`
Configurations to enable feedback buttons
Enables a button to allow users to suggest edits via pull requests
Enables a button to allow users to raise an issue about the documentation
Customize the dark mode toggle.
Set if you always want to show light or dark mode for new users. When not
set, we default to the same mode as the user's operating system.
Set to true to hide the dark/light mode toggle. You can combine `isHidden` with `default` to force your docs to only use light or dark mode. For example:
```json Only Dark Mode
"modeToggle": {
"default": "dark",
"isHidden": true
}
```
```json Only Light Mode
"modeToggle": {
"default": "light",
"isHidden": true
}
```
A background image to be displayed behind every page. See example with
[Infisical](https://infisical.com/docs) and [FRPC](https://frpc.io).
---
## Code Blocks
*Fenced code blocks with automatic syntax highlighting, optional file titles, and CodeGroup for multi-language examples side by side.*
Fenced code blocks are automatically syntax-highlighted.
## Basic code block
```javascript
function greet(name) {
return `Hello, ${name}!`;
}
```
Add a language identifier after the opening fence for syntax highlighting:
````mdx
```javascript
function greet(name) {
return `Hello, ${name}!`;
}
```
````
## With title
Add a title after the language:
```javascript server.js
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello World');
});
app.listen(3000);
```
````mdx
```javascript server.js
const express = require('express');
// ...
```
````
## Code groups
Show the same example in multiple languages:
```javascript Node.js
const response = await fetch('https://api.example.com/data');
const data = await response.json();
```
```python Python
import requests
response = requests.get('https://api.example.com/data')
data = response.json()
```
```bash cURL
curl -X GET https://api.example.com/data
```
````mdx
```javascript Node.js
const response = await fetch('https://api.example.com/data');
```
```python Python
response = requests.get('https://api.example.com/data')
```
````
---
## Components
*Built-in MDX components for your documentation pages — cards, callouts, tabs, steps, accordions, and code groups. No imports needed.*
Jamdesk includes built-in components that you can use directly in your MDX files. No imports needed.
## Available components
| Component | Use for |
|-----------|---------|
| **Card** | Highlighting features, linking to pages |
| **Columns** | Grid layouts of cards |
| **Callout** | Notes, tips, warnings |
| **Tabs** | Showing alternatives (languages, platforms) |
| **Accordion** | Collapsible sections |
| **Steps** | Sequential instructions |
| **CodeGroup** | Multi-language code examples |
## Example
Here's a card with an icon that links to another page:
Get up and running in minutes.
```mdx
Get up and running in minutes.
```
Browse the **Components** tab in the sidebar to see live examples of every component.
---
## Pages
*How MDX files become pages, how frontmatter sets titles and descriptions, and how file paths map to URLs in your documentation site.*
Every `.mdx` file in your project becomes a page. The file path determines the URL.
## Frontmatter
Each page starts with frontmatter — metadata between `---` fences:
```mdx
---
title: My Page Title
description: A short description for search engines
---
Your content starts here.
```
| Field | Required | Description |
|-------|----------|-------------|
| `title` | Yes | Page title shown in the browser tab and sidebar |
| `description` | No | Meta description for SEO |
## File organization
Your file structure maps directly to URLs:
```
introduction.mdx → /introduction
quickstart.mdx → /quickstart
guides/deployment.mdx → /guides/deployment
api/users/list.mdx → /api/users/list
```
## Markdown features
MDX supports all standard Markdown:
- **Bold** and *italic* text
- `Inline code` and fenced code blocks
- [Links](https://example.com) and images
- Ordered and unordered lists
- Tables and blockquotes
- Headings (`##`, `###`, `####`)
Headings on the page automatically appear in the right sidebar as a table of contents.
---
## Create Plant
---
## Delete Plant
---
## Get Plants
---
## Text Chat Widget
*Embed an AI-powered text chat widget on your website*
## Prerequisites
In the Trillet Portal sidebar, click the **workspace name dropdown** at the top. Your Workspace ID is displayed next to each workspace - click to copy.
Navigate to **Call Flows** in the sidebar. Each call flow card displays its **Agent ID** - copy it from the card.
Go to **Settings → Domain** and add the domain where you'll embed the widget (e.g. `https://yoursite.com`). This is required to avoid CORS errors. Allow up to 24 hours for propagation. Skip this if you're using a whitelabelled custom domain.
Open your call flow, go to the **Settings** tab, and toggle **Public Access** on. Without this, `startPublicCall()` will be rejected.
Never expose your API key in client-side code. The widget uses `startPublicCall()` which only requires the Workspace ID and Agent ID.
## Integration
Choose between a minimal quick-start snippet or a complete styled widget, then pick your framework.
Paste this before the closing `