# Agent Chat Completion (GHL-Safe)
Source: https://docs.assistable.ai/api-reference/agent-chat-completion-ghl-safe
/api-reference/chat-api.json post /v2/ghl-chat-completion
# Get an alert
Source: https://docs.assistable.ai/api-reference/alerts/get-an-alert
/direct/openapi.json get /v3/alerts/{id}
Requires scope `alerts:read`.
# List alerts
Source: https://docs.assistable.ai/api-reference/alerts/list-alerts
/direct/openapi.json get /v3/alerts
Requires scope `alerts:list`.
# Update an alert's resolution status or note
Source: https://docs.assistable.ai/api-reference/alerts/update-an-alerts-resolution-status-or-note
/direct/openapi.json patch /v3/alerts/{id}
Requires scope `alerts:update`.
# Create an appointment
Source: https://docs.assistable.ai/api-reference/appointments/create-an-appointment
/v3/openapi.json post /v3/appointments
Requires scope `appointments:create`.
# Get an appointment
Source: https://docs.assistable.ai/api-reference/appointments/get-an-appointment
/v3/openapi.json get /v3/appointments/{id}
Requires scope `appointments:read`.
# List appointments in a date range
Source: https://docs.assistable.ai/api-reference/appointments/list-appointments-in-a-date-range
/v3/openapi.json get /v3/appointments
Requires scope `appointments:list`.
# Update an appointment
Source: https://docs.assistable.ai/api-reference/appointments/update-an-appointment
/v3/openapi.json patch /v3/appointments/{id}
Requires scope `appointments:update`.
# Archive Assistant
Source: https://docs.assistable.ai/api-reference/archive-assistant
/api-reference/assistant-api.json delete /v2/delete-assistant
# Assign assistants to a folder
Source: https://docs.assistable.ai/api-reference/assistant-folders/assign-assistants-to-a-folder
/direct/openapi.json post /v3/assistant-folders/{id}/assign
Requires scope `assistants:update`.
# Create an assistant folder
Source: https://docs.assistable.ai/api-reference/assistant-folders/create-an-assistant-folder
/direct/openapi.json post /v3/assistant-folders
Requires scope `assistants:create`.
# Delete (archive) an assistant folder
Source: https://docs.assistable.ai/api-reference/assistant-folders/delete-archive-an-assistant-folder
/direct/openapi.json delete /v3/assistant-folders/{id}
Requires scope `assistants:delete`.
# List assistant folders
Source: https://docs.assistable.ai/api-reference/assistant-folders/list-assistant-folders
/direct/openapi.json get /v3/assistant-folders
Requires scope `assistants:list`.
# Remove assistants from a folder
Source: https://docs.assistable.ai/api-reference/assistant-folders/remove-assistants-from-a-folder
/direct/openapi.json post /v3/assistant-folders/{id}/remove
Requires scope `assistants:update`.
# Update an assistant folder
Source: https://docs.assistable.ai/api-reference/assistant-folders/update-an-assistant-folder
/direct/openapi.json patch /v3/assistant-folders/{id}
Requires scope `assistants:update`.
# Add a note to an assistant
Source: https://docs.assistable.ai/api-reference/assistants/add-a-note-to-an-assistant
/direct/openapi.json post /v3/assistants/{id}/notes
Requires scope `assistants:create`.
# Archive an assistant
Source: https://docs.assistable.ai/api-reference/assistants/archive-an-assistant
/direct/openapi.json post /v3/assistants/{id}/archive
Requires scope `assistants:update`.
# Create an assistant
Source: https://docs.assistable.ai/api-reference/assistants/create-an-assistant
/direct/openapi.json post /v3/assistants
Requires scope `assistants:create`.
# Delete an assistant note
Source: https://docs.assistable.ai/api-reference/assistants/delete-an-assistant-note
/direct/openapi.json delete /v3/assistants/{id}/notes/{note_id}
Requires scope `assistants:delete`.
# Delete (soft) an assistant
Source: https://docs.assistable.ai/api-reference/assistants/delete-soft-an-assistant
/direct/openapi.json delete /v3/assistants/{id}
Requires scope `assistants:delete`.
# Duplicate an assistant
Source: https://docs.assistable.ai/api-reference/assistants/duplicate-an-assistant
/direct/openapi.json post /v3/assistants/{id}/duplicate
Requires scope `assistants:create`.
# Get an assistant
Source: https://docs.assistable.ai/api-reference/assistants/get-an-assistant
/direct/openapi.json get /v3/assistants/{id}
Requires scope `assistants:read`.
# List assistant notes
Source: https://docs.assistable.ai/api-reference/assistants/list-assistant-notes
/direct/openapi.json get /v3/assistants/{id}/notes
Requires scope `assistants:read`.
# List assistant versions
Source: https://docs.assistable.ai/api-reference/assistants/list-assistant-versions
/direct/openapi.json get /v3/assistants/{id}/versions
Requires scope `assistants:read`.
# List assistants
Source: https://docs.assistable.ai/api-reference/assistants/list-assistants
/direct/openapi.json get /v3/assistants
Requires scope `assistants:list`.
# Revert an assistant to a version
Source: https://docs.assistable.ai/api-reference/assistants/revert-an-assistant-to-a-version
/direct/openapi.json post /v3/assistants/{id}/versions/{version_id}/revert
Requires scope `assistants:update`. Note: reverting does not restore voice_settings (greeting mode, opening messages, or voicemail behavior) — those keep their current values.
# Unarchive an assistant
Source: https://docs.assistable.ai/api-reference/assistants/unarchive-an-assistant
/direct/openapi.json post /v3/assistants/{id}/unarchive
Requires scope `assistants:update`.
# Update an assistant
Source: https://docs.assistable.ai/api-reference/assistants/update-an-assistant
/direct/openapi.json patch /v3/assistants/{id}
Requires scope `assistants:update`.
# Call stats for the subaccount
Source: https://docs.assistable.ai/api-reference/calls/call-stats-for-the-subaccount
/direct/openapi.json get /v3/calls/stats
Requires scope `calls:read`.
# Get a call (rich detail)
Source: https://docs.assistable.ai/api-reference/calls/get-a-call-rich-detail
/direct/openapi.json get /v3/calls/{id}
Requires scope `calls:read`.
# List call history
Source: https://docs.assistable.ai/api-reference/calls/list-call-history
/direct/openapi.json get /v3/calls
Requires scope `calls:list`.
# Place an AI voice call
Source: https://docs.assistable.ai/api-reference/calls/place-an-ai-voice-call
/direct/openapi.json post /v3/calls
Requires scope `calls:create`.
# Run an AI chat completion on a conversation
Source: https://docs.assistable.ai/api-reference/chat/run-an-ai-chat-completion-on-a-conversation
/direct/openapi.json post /v3/chat/completions
Requires scope `chat:create`.
# Add a note to a contact
Source: https://docs.assistable.ai/api-reference/contacts/add-a-note-to-a-contact
/direct/openapi.json post /v3/contacts/{id}/notes
Requires scope `contacts:create`.
# Create a contact
Source: https://docs.assistable.ai/api-reference/contacts/create-a-contact
/direct/openapi.json post /v3/contacts
Requires scope `contacts:create`.
# Delete a contact note
Source: https://docs.assistable.ai/api-reference/contacts/delete-a-contact-note
/direct/openapi.json delete /v3/contacts/{id}/notes/{note_id}
Requires scope `contacts:delete`.
# Delete (archive) a contact
Source: https://docs.assistable.ai/api-reference/contacts/delete-archive-a-contact
/direct/openapi.json delete /v3/contacts/{id}
Requires scope `contacts:delete`.
# Get a contact
Source: https://docs.assistable.ai/api-reference/contacts/get-a-contact
/direct/openapi.json get /v3/contacts/{id}
Requires scope `contacts:read`.
# List contact interactions
Source: https://docs.assistable.ai/api-reference/contacts/list-contact-interactions
/direct/openapi.json get /v3/contacts/{id}/interactions
Requires scope `contacts:read`.
# List contact notes
Source: https://docs.assistable.ai/api-reference/contacts/list-contact-notes
/direct/openapi.json get /v3/contacts/{id}/notes
Requires scope `contacts:read`.
# List contacts
Source: https://docs.assistable.ai/api-reference/contacts/list-contacts
/direct/openapi.json get /v3/contacts
Requires scope `contacts:list`.
# Permanently delete a contact
Source: https://docs.assistable.ai/api-reference/contacts/permanently-delete-a-contact
/direct/openapi.json post /v3/contacts/{id}/permanent-delete
Requires scope `contacts:delete`.
# Update a contact
Source: https://docs.assistable.ai/api-reference/contacts/update-a-contact
/direct/openapi.json patch /v3/contacts/{id}
Requires scope `contacts:update`.
# Conversation stats for the subaccount
Source: https://docs.assistable.ai/api-reference/conversations/conversation-stats-for-the-subaccount
/direct/openapi.json get /v3/conversations/stats
Requires scope `conversations:read`.
# Delete (soft) a conversation
Source: https://docs.assistable.ai/api-reference/conversations/delete-soft-a-conversation
/direct/openapi.json delete /v3/conversations/{id}
Requires scope `conversations:delete`.
# Get a conversation
Source: https://docs.assistable.ai/api-reference/conversations/get-a-conversation
/direct/openapi.json get /v3/conversations/{id}
Requires scope `conversations:read`.
# List calls for a conversation
Source: https://docs.assistable.ai/api-reference/conversations/list-calls-for-a-conversation
/direct/openapi.json get /v3/conversations/{id}/calls
Requires scope `conversations:read`.
# List conversations
Source: https://docs.assistable.ai/api-reference/conversations/list-conversations
/direct/openapi.json get /v3/conversations
Requires scope `conversations:list`.
# Update a conversation
Source: https://docs.assistable.ai/api-reference/conversations/update-a-conversation
/direct/openapi.json patch /v3/conversations/{id}
Requires scope `conversations:update`.
# Create Assistant
Source: https://docs.assistable.ai/api-reference/create-assistant
/api-reference/assistant-api.json post /v2/create-assistant
# Create Flow
Source: https://docs.assistable.ai/api-reference/create-flow
/api-reference/assistant-api.json post /v2/create-flow
Creates a new flow for the specified location
# Create Message
Source: https://docs.assistable.ai/api-reference/create-message
/api-reference/chat-api.json post /v2/create-message
# Create a flow
Source: https://docs.assistable.ai/api-reference/flows/create-a-flow
/direct/openapi.json post /v3/flows
Requires scope `flows:create`.
# Get Assistant
Source: https://docs.assistable.ai/api-reference/get-assistant
/api-reference/assistant-api.json get /v2/get-assistant
# Get Messages
Source: https://docs.assistable.ai/api-reference/get-messages
/api-reference/chat-api.json get /v2/get-conversation
# Add a file source
Source: https://docs.assistable.ai/api-reference/knowledge-base/add-a-file-source
/direct/openapi.json post /v3/knowledge-bases/{id}/sources/file
Requires scope `knowledge:create`.
# Add a text source
Source: https://docs.assistable.ai/api-reference/knowledge-base/add-a-text-source
/direct/openapi.json post /v3/knowledge-bases/{id}/sources/text
Requires scope `knowledge:create`.
# Add a URL source
Source: https://docs.assistable.ai/api-reference/knowledge-base/add-a-url-source
/direct/openapi.json post /v3/knowledge-bases/{id}/sources/url
Requires scope `knowledge:create`.
# Add an FAQ source
Source: https://docs.assistable.ai/api-reference/knowledge-base/add-an-faq-source
/direct/openapi.json post /v3/knowledge-bases/{id}/sources/faq
Requires scope `knowledge:create`.
# Archive a knowledge base
Source: https://docs.assistable.ai/api-reference/knowledge-base/archive-a-knowledge-base
/direct/openapi.json delete /v3/knowledge-bases/{id}
Requires scope `knowledge:delete`.
# Assign a knowledge base to an assistant
Source: https://docs.assistable.ai/api-reference/knowledge-base/assign-a-knowledge-base-to-an-assistant
/direct/openapi.json post /v3/knowledge-bases/{id}/assign
Requires scope `knowledge:update`.
# Create a knowledge base
Source: https://docs.assistable.ai/api-reference/knowledge-base/create-a-knowledge-base
/direct/openapi.json post /v3/knowledge-bases
Requires scope `knowledge:create`.
# Create a query training
Source: https://docs.assistable.ai/api-reference/knowledge-base/create-a-query-training
/direct/openapi.json post /v3/knowledge-bases/{id}/query-trainings
Requires scope `knowledge:create`.
# Delete a query training
Source: https://docs.assistable.ai/api-reference/knowledge-base/delete-a-query-training
/direct/openapi.json delete /v3/knowledge-bases/{id}/query-trainings/{training_id}
Requires scope `knowledge:delete`.
# Delete a source
Source: https://docs.assistable.ai/api-reference/knowledge-base/delete-a-source
/direct/openapi.json delete /v3/knowledge-bases/{id}/sources/{source_id}
Requires scope `knowledge:delete`.
# Disable voice for a knowledge base
Source: https://docs.assistable.ai/api-reference/knowledge-base/disable-voice-for-a-knowledge-base
/direct/openapi.json post /v3/knowledge-bases/{id}/voice/disable
Requires scope `knowledge:update`.
# Enable voice for a knowledge base
Source: https://docs.assistable.ai/api-reference/knowledge-base/enable-voice-for-a-knowledge-base
/direct/openapi.json post /v3/knowledge-bases/{id}/voice/enable
Requires scope `knowledge:update`.
# Get a knowledge base (with sources)
Source: https://docs.assistable.ai/api-reference/knowledge-base/get-a-knowledge-base-with-sources
/direct/openapi.json get /v3/knowledge-bases/{id}
Requires scope `knowledge:read`.
# List an assistant's knowledge base ids
Source: https://docs.assistable.ai/api-reference/knowledge-base/list-an-assistants-knowledge-base-ids
/direct/openapi.json get /v3/assistants/{id}/knowledge-bases
Requires scope `knowledge:read`.
# List knowledge bases
Source: https://docs.assistable.ai/api-reference/knowledge-base/list-knowledge-bases
/direct/openapi.json get /v3/knowledge-bases
Requires scope `knowledge:list`.
# List query trainings
Source: https://docs.assistable.ai/api-reference/knowledge-base/list-query-trainings
/direct/openapi.json get /v3/knowledge-bases/{id}/query-trainings
Requires scope `knowledge:read`.
# Remove a knowledge base from an assistant
Source: https://docs.assistable.ai/api-reference/knowledge-base/remove-a-knowledge-base-from-an-assistant
/direct/openapi.json post /v3/knowledge-bases/{id}/remove
Requires scope `knowledge:update`.
# Rename a source
Source: https://docs.assistable.ai/api-reference/knowledge-base/rename-a-source
/direct/openapi.json patch /v3/knowledge-bases/{id}/sources/{source_id}
Requires scope `knowledge:update`.
# Toggle a query training active flag
Source: https://docs.assistable.ai/api-reference/knowledge-base/toggle-a-query-training-active-flag
/direct/openapi.json post /v3/knowledge-bases/{id}/query-trainings/{training_id}/toggle
Requires scope `knowledge:update`.
# Update a knowledge base
Source: https://docs.assistable.ai/api-reference/knowledge-base/update-a-knowledge-base
/direct/openapi.json patch /v3/knowledge-bases/{id}
Requires scope `knowledge:update`.
# Update a query training
Source: https://docs.assistable.ai/api-reference/knowledge-base/update-a-query-training
/direct/openapi.json patch /v3/knowledge-bases/{id}/query-trainings/{training_id}
Requires scope `knowledge:update`.
# Make AI Call (GHL-Safe)
Source: https://docs.assistable.ai/api-reference/make-ai-call-ghl-safe
/api-reference/calling-api.json post /v2/ghl/make-call
# Create a message
Source: https://docs.assistable.ai/api-reference/messages/create-a-message
/direct/openapi.json post /v3/messages
Requires scope `messages:create`.
# List messages in a conversation
Source: https://docs.assistable.ai/api-reference/messages/list-messages-in-a-conversation
/direct/openapi.json get /v3/conversations/{id}/messages
Requires scope `messages:list`.
# Create a monitor rule
Source: https://docs.assistable.ai/api-reference/monitor-rules/create-a-monitor-rule
/direct/openapi.json post /v3/monitor-rules
Requires scope `monitor-rules:create`.
# Delete a monitor rule
Source: https://docs.assistable.ai/api-reference/monitor-rules/delete-a-monitor-rule
/direct/openapi.json delete /v3/monitor-rules/{id}
Requires scope `monitor-rules:delete`.
# Get a monitor rule
Source: https://docs.assistable.ai/api-reference/monitor-rules/get-a-monitor-rule
/direct/openapi.json get /v3/monitor-rules/{id}
Requires scope `monitor-rules:read`.
# List monitor rules
Source: https://docs.assistable.ai/api-reference/monitor-rules/list-monitor-rules
/direct/openapi.json get /v3/monitor-rules
Requires scope `monitor-rules:list`.
# Update a monitor rule
Source: https://docs.assistable.ai/api-reference/monitor-rules/update-a-monitor-rule
/direct/openapi.json patch /v3/monitor-rules/{id}
Requires scope `monitor-rules:update`.
# Add phone numbers to a pool
Source: https://docs.assistable.ai/api-reference/number-pools/add-phone-numbers-to-a-pool
/direct/openapi.json post /v3/number-pools/{id}/add-numbers
Requires scope `numbers:update`.
# Create a number pool
Source: https://docs.assistable.ai/api-reference/number-pools/create-a-number-pool
/direct/openapi.json post /v3/number-pools
Requires scope `numbers:create`.
# Delete a number pool
Source: https://docs.assistable.ai/api-reference/number-pools/delete-a-number-pool
/direct/openapi.json delete /v3/number-pools/{id}
Requires scope `numbers:delete`.
# Get a number pool
Source: https://docs.assistable.ai/api-reference/number-pools/get-a-number-pool
/direct/openapi.json get /v3/number-pools/{id}
Requires scope `numbers:read`.
# List number pools
Source: https://docs.assistable.ai/api-reference/number-pools/list-number-pools
/direct/openapi.json get /v3/number-pools
Requires scope `numbers:list`.
# Remove phone numbers from a pool
Source: https://docs.assistable.ai/api-reference/number-pools/remove-phone-numbers-from-a-pool
/direct/openapi.json post /v3/number-pools/{id}/remove-numbers
Requires scope `numbers:update`.
# Update a number pool
Source: https://docs.assistable.ai/api-reference/number-pools/update-a-number-pool
/direct/openapi.json patch /v3/number-pools/{id}
Requires scope `numbers:update`.
# Assign a phone number to an assistant
Source: https://docs.assistable.ai/api-reference/phone-numbers/assign-a-phone-number-to-an-assistant
/direct/openapi.json post /v3/phone-numbers/{id}/assign
Requires scope `numbers:update`.
# Get a phone number
Source: https://docs.assistable.ai/api-reference/phone-numbers/get-a-phone-number
/direct/openapi.json get /v3/phone-numbers/{id}
Requires scope `numbers:read`.
# List owned phone numbers
Source: https://docs.assistable.ai/api-reference/phone-numbers/list-owned-phone-numbers
/direct/openapi.json get /v3/phone-numbers
Requires scope `numbers:list`.
# Update a phone number
Source: https://docs.assistable.ai/api-reference/phone-numbers/update-a-phone-number
/direct/openapi.json patch /v3/phone-numbers/{id}
Requires scope `numbers:update`.
# Add a user to a subaccount
Source: https://docs.assistable.ai/api-reference/subaccounts/add-a-user-to-a-subaccount
/direct/openapi.json post /v3/subaccounts/{id}/users
Requires scope `subaccounts:update`.
# Create a subaccount — Assistable Direct (name), or provision from a GoHighLevel Location ID (location_id)
Source: https://docs.assistable.ai/api-reference/subaccounts/create-a-subaccount-—-assistable-direct-name-or-provision-from-a-gohighlevel-location-id-location_id
/direct/openapi.json post /v3/subaccounts
Requires scope `subaccounts:create`.
# Credit a subaccount or workspace wallet
Source: https://docs.assistable.ai/api-reference/subaccounts/credit-a-subaccount-or-workspace-wallet
/direct/openapi.json post /v3/subaccounts/{id}/wallet/credit
Requires scope `billing:update`.
# Debit a subaccount or workspace wallet
Source: https://docs.assistable.ai/api-reference/subaccounts/debit-a-subaccount-or-workspace-wallet
/direct/openapi.json post /v3/subaccounts/{id}/wallet/debit
Requires scope `billing:update`.
# Get a subaccount
Source: https://docs.assistable.ai/api-reference/subaccounts/get-a-subaccount
/direct/openapi.json get /v3/subaccounts/{id}
Requires scope `subaccounts:read`.
# Get a subaccount's wallet balances
Source: https://docs.assistable.ai/api-reference/subaccounts/get-a-subaccounts-wallet-balances
/direct/openapi.json get /v3/subaccounts/{id}/wallet
Requires scope `billing:read`.
# List subaccount users
Source: https://docs.assistable.ai/api-reference/subaccounts/list-subaccount-users
/direct/openapi.json get /v3/subaccounts/{id}/users
Requires scope `subaccounts:read`.
# List subaccounts
Source: https://docs.assistable.ai/api-reference/subaccounts/list-subaccounts
/direct/openapi.json get /v3/subaccounts
Requires scope `subaccounts:list`. Returns up to 100 subaccounts per page. When `meta.next_cursor` is non-null, pass it as the `cursor` query parameter on the next request. Continue until `meta.next_cursor` is null.
# Remove a user from a subaccount
Source: https://docs.assistable.ai/api-reference/subaccounts/remove-a-user-from-a-subaccount
/direct/openapi.json delete /v3/subaccounts/{id}/users/{userId}
Requires scope `subaccounts:update`.
# Update a subaccount user's role
Source: https://docs.assistable.ai/api-reference/subaccounts/update-a-subaccount-users-role
/direct/openapi.json patch /v3/subaccounts/{id}/users/{userId}
Requires scope `subaccounts:update`.
# Create a tag
Source: https://docs.assistable.ai/api-reference/tags/create-a-tag
/direct/openapi.json post /v3/tags
Requires scope `tags:create`.
# Delete a tag
Source: https://docs.assistable.ai/api-reference/tags/delete-a-tag
/direct/openapi.json delete /v3/tags/{id}
Requires scope `tags:delete`.
# Get a tag
Source: https://docs.assistable.ai/api-reference/tags/get-a-tag
/direct/openapi.json get /v3/tags/{id}
Requires scope `tags:read`.
# List tags
Source: https://docs.assistable.ai/api-reference/tags/list-tags
/direct/openapi.json get /v3/tags
Requires scope `tags:list`.
# Permanently delete a tag
Source: https://docs.assistable.ai/api-reference/tags/permanently-delete-a-tag
/direct/openapi.json post /v3/tags/{id}/permanent-delete
Requires scope `tags:delete`.
# Update a tag
Source: https://docs.assistable.ai/api-reference/tags/update-a-tag
/direct/openapi.json patch /v3/tags/{id}
Requires scope `tags:update`.
# Assign a tool to an assistant
Source: https://docs.assistable.ai/api-reference/tools/assign-a-tool-to-an-assistant
/direct/openapi.json post /v3/tools/{id}/assign
Requires scope `tools:update`.
# Copy a tool into this subaccount
Source: https://docs.assistable.ai/api-reference/tools/copy-a-tool-into-this-subaccount
/direct/openapi.json post /v3/tools/{id}/copy
Requires scope `tools:create`.
# Create a tool
Source: https://docs.assistable.ai/api-reference/tools/create-a-tool
/direct/openapi.json post /v3/tools
Requires scope `tools:create`.
# Delete (soft) a tool
Source: https://docs.assistable.ai/api-reference/tools/delete-soft-a-tool
/direct/openapi.json delete /v3/tools/{id}
Requires scope `tools:delete`.
# Get a tool (with parameters + headers)
Source: https://docs.assistable.ai/api-reference/tools/get-a-tool-with-parameters-+-headers
/direct/openapi.json get /v3/tools/{id}
Requires scope `tools:read`.
# List an assistant's tools
Source: https://docs.assistable.ai/api-reference/tools/list-an-assistants-tools
/direct/openapi.json get /v3/assistants/{id}/tools
Requires scope `tools:read`.
# List distinct tool categories
Source: https://docs.assistable.ai/api-reference/tools/list-distinct-tool-categories
/direct/openapi.json get /v3/tools/categories
Requires scope `tools:read`.
# List tools
Source: https://docs.assistable.ai/api-reference/tools/list-tools
/direct/openapi.json get /v3/tools
Requires scope `tools:list`.
# Remove a tool from an assistant
Source: https://docs.assistable.ai/api-reference/tools/remove-a-tool-from-an-assistant
/direct/openapi.json post /v3/tools/{id}/remove
Requires scope `tools:update`.
# Update a tool
Source: https://docs.assistable.ai/api-reference/tools/update-a-tool
/direct/openapi.json patch /v3/tools/{id}
Requires scope `tools:update`.
# Update Assistant
Source: https://docs.assistable.ai/api-reference/update-assistant
/api-reference/assistant-api.json put /v2/update-assistant
# Distinct voice filter options
Source: https://docs.assistable.ai/api-reference/voices/distinct-voice-filter-options
/direct/openapi.json get /v3/voices/filter-options
Requires scope `voices:read`.
# Get a voice
Source: https://docs.assistable.ai/api-reference/voices/get-a-voice
/direct/openapi.json get /v3/voices/{id}
Requires scope `voices:read`.
# List voices
Source: https://docs.assistable.ai/api-reference/voices/list-voices
/direct/openapi.json get /v3/voices
Requires scope `voices:list`.
# Toggle whether a custom voice can be copied
Source: https://docs.assistable.ai/api-reference/voices/toggle-whether-a-custom-voice-can-be-copied
/direct/openapi.json patch /v3/voices/{id}/allow-copy
Requires scope `voices:update`.
# Voice library stats
Source: https://docs.assistable.ai/api-reference/voices/voice-library-stats
/direct/openapi.json get /v3/voices/stats
Requires scope `voices:read`.
# AI Replying Tag
Source: https://docs.assistable.ai/build/chat-ai/ai-replying-tag
Use the ai_replying tag to build fallback workflows and monitor AI response generation.
## How the AI Replying Tag Works
Whenever an AI is generating a response, the tag `ai_replying` is automatically added to the contact. This tag is:
* **Added** before AI generation begins
* **Removed** after the message is successfully sent to the CRM (i.e., a messageId is available)
You can see this in real-time in the AI portal during response generation.
## Use Cases
### Fallback Workflows
Use the `ai_replying` tag to trigger a workflow with a **wait timeout**. This is helpful for:
* **Vendor or platform timeouts** — If the AI takes too long, trigger an alternative action
* **Server maintenance** — Provide a fallback response if the AI service is temporarily unavailable
* **Decision-making** — Build logic around whether the AI successfully replied
### Example Workflow
1. Trigger: `ai_replying` tag added
2. Wait: 30 seconds
3. Check: Is `ai_replying` still present?
4. If yes → Send fallback message or notify team
5. If no → AI replied successfully, no action needed
# AI Chat Widget
Source: https://docs.assistable.ai/build/chat-ai/chat-widget
Deploy an AI-powered voice widget on your website with Call You / Call Me functionality.
## AI Voice Widget (Beta)
The AI Voice Widget enables a **Call You / Call Me** interface on your website. Visitors can either receive a call from your AI assistant or initiate a call to it directly from the browser.
## Installation
To install the widget, you'll need to customize a few lines of the embed code:
| Line | What to Change | Example |
| ---- | ------------------------------ | ---------------- |
| 327 | Phone number (pretty format) | `(678) 931-7883` |
| 330 | Phone number (raw format) | `+16789317883` |
| 416 | GHL Inbound Webhook URL | Your webhook URL |
| 523 | Phone number (no country code) | `6789317883` |
### Embedding Steps
Copy the provided HTML/CSS/JavaScript code from the widget builder.
Replace the placeholder phone numbers with your AI assistant's assigned number.
Add your GoHighLevel inbound webhook URL to capture lead data.
Paste the code into a custom HTML/code element on your website.
This widget works on any website that supports custom HTML embedding — not just GoHighLevel sites.
# Global Kill Switch (ai_off)
Source: https://docs.assistable.ai/build/chat-ai/kill-switch
Instantly disable AI responses for any contact using the ai_off tag.
## Overview
The `ai_off` tag is a global kill switch that immediately stops AI from responding to a contact — even if an Active Tag is present. This gives you full control over when AI should and shouldn't engage.
## For Chat AI
Add the tag `ai_off` to the contact in GoHighLevel. The AI will stop responding immediately.
Send a test message like "Can you help me?" — confirm the AI does not respond.
Remove the `ai_off` tag. The AI resumes normal chat behavior.
## For Voice AI
You can use the same tag in voice workflows:
1. Create a conditional workflow (IVR AI Switch)
2. Add a condition: **If contact tag does NOT include `ai_off`** → Proceed with AI
3. **If contact tag includes `ai_off`** → Route to human agent or manual transfer
## Automation Tips
* Use a GHL workflow to automatically apply `ai_off` when a human agent takes over a conversation
* Remove `ai_off` when the human is done and you want AI to resume
* Create a custom button or toggle in your CRM to quickly add/remove the tag
# Chat AI Overview
Source: https://docs.assistable.ai/build/chat-ai/overview
Deploy AI chat assistants that respond to SMS and live chat without workflows, API calls, or webhooks.
## How Chat AI Works
Assistable's Chat AI responds to contacts automatically using **Active Tags**. No workflows, API calls, or webhooks are needed. When a message comes in and an Active Tag is detected on the contact, the system knows which assistant should respond.
### Active Tag Behavior
* **No Active Tag** → AI won't reply, but it still logs the conversation and adds it to the assistant's memory
* **Active Tag Present** → System checks which assistant is linked to that tag and generates a response
### Setting Up Active Tags
1. Go to **Active Tags** in the sidebar menu
2. Create a tag with a unique name
3. Link it to an AI Assistant
Make your active tags unique so they don't conflict with existing CRM or contact list tags. You can dynamically reassign which assistant is tied to a tag without redoing your automation setup.
## Turning Chat AI On and Off
### Turning AI On
Assign an Active Tag to a contact. The easiest way is to enroll contacts into a GHL workflow that applies the tag. You can trigger this automatically (e.g., when a form is submitted).
### Turning AI Off
Three methods:
1. **Remove the Active Tag** — No Active Tag = AI is off
2. **Apply the `ai_off` tag** — Global kill switch that overrides Active Tags. [Learn more](/build/chat-ai/kill-switch)
3. **Sleep Mode** — Temporarily pauses AI when a user or workflow sends a message
### Sleep Mode
Sleep Mode pauses AI responses for a set number of minutes after an outbound message is sent. This prevents overlap between human and AI replies.
Even automated messages (like appointment confirmations) trigger Sleep Mode. Be careful when enabling this alongside automated workflows.
# Calculate Distance
Source: https://docs.assistable.ai/build/custom-tools/calculate-distance
Create a custom tool that calculates the distance between two locations for your AI assistant.
## Overview
The **Calculate Distance** custom tool enables your AI assistant to compute the distance between two addresses or locations during a conversation. This is useful for service-area businesses (e.g., delivery, home services, moving companies) that need to determine if a customer is within range or provide distance-based pricing.
## Use Cases
* **Home service businesses** — Determine if a customer's location is within your service radius
* **Delivery services** — Calculate delivery distance for pricing estimates
* **Moving companies** — Provide distance-based quotes automatically
* **Real estate** — Calculate distance between properties and points of interest
## How It Works
The tool accepts two location parameters (origin and destination) and returns the distance between them. Your AI assistant can then use this information to make decisions, provide quotes, or determine service eligibility.
In your Assistable dashboard, navigate to your assistant's **Custom Tools** section and click **Create Custom Tool**.
Set up the following:
* **Unique Name**: `calculate_distance`
* **Description**: "Calculate the distance between two addresses"
* **Parameters**: `origin` (starting address), `destination` (ending address)
Use a service like Buildship or a custom webhook to call a distance API (e.g., Google Maps Distance Matrix API) and return the result.
Paste the endpoint URL from your backend service into the custom tool's endpoint field and test the connection.
Save the tool and add it to your assistant. Update your prompt to instruct the AI when to use the distance calculation.
Combine this tool with [Save Address](/build/custom-tools/save-address) to first collect the user's address, then calculate the distance to your business location.
## Related Pages
Learn the fundamentals of custom tools
Collect and save user addresses
Add web search capabilities
Update CRM contact information
# Call from SMS
Source: https://docs.assistable.ai/build/custom-tools/call-from-sms
Create a custom tool that transitions from an SMS conversation to a phone call with full context.
## Overview
The **Call from SMS** custom tool enables your AI assistant to initiate a phone call to a user directly from an SMS conversation — while carrying over the full conversation context. This means when the voice assistant calls the user, it already knows what was discussed via text.
## Why Use This?
Some conversations are better handled over the phone — complex scheduling, sensitive information, or when a user explicitly requests a call. This tool bridges the gap between chat and voice seamlessly.
**Key benefits:**
* **Context preservation** — The voice AI knows what was discussed in SMS
* **Seamless transition** — No need for the user to repeat themselves
* **User-initiated** — The AI calls when the user is ready
## How It Works
When the AI determines a phone call would be more effective (or the user requests one), it triggers this tool. The tool uses the Assistable API to initiate an outbound call to the contact, passing along the conversation context so the voice assistant can pick up where the SMS left off.
Navigate to **Custom Tools** in your assistant settings and create a new tool named `call_user_from_sms`.
Set the description to: *"Call this tool when the user wants to switch from SMS to a phone call. The voice assistant will have full context of the SMS conversation."*
Use the [Assistable API](/api-reference) to trigger an outbound call. The endpoint should pass the `contact_id` and conversation summary to the voice assistant.
Add instructions telling the AI when it's appropriate to offer a phone call (e.g., complex topics, user frustration, or explicit requests).
This tool requires a [Voice AI setup](/build/voice-ai/overview) with an active phone number configured for outbound calling.
## Related Pages
The reverse — send texts during voice calls
Send conversation summaries to clients
Configure voice AI assistants
Learn the fundamentals of custom tools
# Managing Tools
Source: https://docs.assistable.ai/build/custom-tools/managing-tools
Copy, search, and organize custom tools across accounts.
## Tool Management in Assistant Builder
### Adding Tools
1. Open the Assistant Builder and go to **Tools**
2. Click **Add Tool** to browse available tools
3. Select or search for the tool you want to add
### Copying Tools by ID
Custom tools can be copied and shared using their Tool ID:
1. Get the **Tool ID** from the source account
2. In the destination account, enter the ID in the "Copy Tool by ID" field
3. Click **Copy Tool by ID** to import it
Authentication credentials (API keys) are NOT transferred for security reasons. You'll need to re-enter them after copying.
### Searching and Filtering
Use the search bar and filtering options to quickly find tools when managing a large collection.
### Deleting Tools
The delete option has been moved to prevent accidental deletions. Look for it in the tool's options menu rather than the main interface.
# Multi-Calendar Booking
Source: https://docs.assistable.ai/build/custom-tools/multi-calendar-booking
Set up multi-calendar booking with custom tools to manage appointments across multiple calendars.
## Overview
Multi-calendar booking allows your AI assistant to manage appointments across **multiple GoHighLevel calendars** — for example, different service types (mortgage vs. refinance), different locations, or different team members. This guide walks through setting up the custom tools, Buildship workflows, and AI configuration needed.
## How It Works
For each calendar, you create **two custom tools**:
1. **Get Available Times** — Fetches open time slots from a specific calendar
2. **Book Appointment** — Books an appointment on that calendar
The AI determines which service the user needs, calls the appropriate tools, and completes the booking — all within a single conversation.
## Prerequisites
* **GoHighLevel Account** with multiple calendars set up
* **Buildship Account** to create and host API endpoints
* **Assistable AI Assistant** to add custom tools and configure prompts
## Step-by-Step Setup
Create separate calendars for each service type. For example:
* **Mortgage Calendar** for mortgage-related appointments
* **Refinance Calendar** for refinance-related appointments
Note each calendar's unique ID — you'll need it for the API calls.
Create a new Buildship workflow:
* **Name**: `get_times_mortgage` (or your service name)
* **Method**: GET request to GoHighLevel's free time slots endpoint
* **Query Parameters**: `calendarId`, `startTime`, `endTime`
* **Headers**: `Authorization: Bearer YOUR_API_KEY`
Deploy and copy the endpoint URL.
Create another Buildship workflow:
* **Name**: `book_appointment_mortgage`
* **Method**: POST request to GoHighLevel's booking endpoint
* **Request Body**: `calendarId`, `contactId`, `locationId`, `startTime` (ISO 8601)
* **Headers**: `Authorization`, `Content-Type: application/json`
Deploy and copy the endpoint URL.
In Assistable, create custom tools matching your Buildship workflows:
**Get Available Times:**
* Name: `get_times_mortgage`
* Description: "Fetch available times for the mortgage calendar"
* Endpoint: Your Buildship URL
* Parameters: `name`, `email`
**Book Appointment:**
* Name: `book_appointment_mortgage`
* Description: "Book an appointment using the selected time from get\_times\_mortgage"
* Endpoint: Your Buildship URL
* Parameters: `time`
Create the same pair of tools for every additional calendar (e.g., `get_times_refinance`, `book_appointment_refinance`).
Define the workflow in your prompt:
1. Determine the service type (mortgage or refinance)
2. Ask qualifying questions
3. Use the appropriate `get_times` tool to fetch availability
4. Present options and book via the matching `book_appointment` tool
Simulate user interactions for each service type. Verify:
* Correct calendar is queried
* Appointments appear in GoHighLevel under the right calendar
* Contact details are accurate
## Tips
Keep tool names uniform across Buildship and Assistable (e.g., `get_times_mortgage` in both places).
Protect API keys using Buildship's environment variables — never hardcode them.
Pass calendar IDs as dynamic parameters so you can add new calendars without creating entirely new tools.
## Related Pages
Learn the fundamentals of custom tools
Troubleshoot booking issues
Extract user data automatically
Build smarter AI flows
# Custom Tools Overview
Source: https://docs.assistable.ai/build/custom-tools/overview
Extend your AI assistant with powerful API-driven custom tools.
## What is a Custom Tool?
Custom tools are powerful extensions that enable voice and chat AI to perform tasks across the internet. They enable custom functionality, data retrieval, data extraction, and workflow automation while understanding and responding contextually.
### How Does a Custom Tool Work?
A custom tool operates as an **LLM function call wrapped in an API call**. It specifies AI functionality through a description and parameters, while the endpoint URL facilitates a POST call with contextual awareness of the endpoint's return data.
## Use Cases
The applications are as broad as your creativity:
* **Update contact information** — AI collects details and sends them to a webhook to update CRM records
* **Book appointments** across multiple calendars
* **Search the web** for real-time information
* **Calculate distances** between locations
* **Send emails or SMS** during conversations
* **Scrape websites** for relevant data
* **Advanced workflows** — Multi-stage tool calls (e.g., generate Stripe checkout links, send via SMS)
## Understanding the Inputs
### Name (raw JSON format)
The unique name of the tool, triggered when the AI determines conditions match. Use plain raw text reflecting the function:
* `update_contact` — For updating contact information
* `get_delivery_date` — For retrieving delivery dates
### Description (conversational text)
Guides the AI on the tool's purpose, how to use it, and when to trigger it. Example:
> "Retrieve the delivery date for a customer's order. Use this tool when a customer asks 'Where is my package?'"
### Endpoint URL
Where the AI sends a POST request with data and expects a response. This is the specific API or webhook endpoint.
### Authorization & Key
Enable authentication using Bearer Token format for endpoints that require API keys.
### Parameters (Key/Value Pairs)
Define the data being requested. Keys should follow JSON conventions (lowercase, underscores, no special characters). Values describe the expected data and format.
Example:
```json theme={null}
{"name": "johnny"}
```
# Save Address
Source: https://docs.assistable.ai/build/custom-tools/save-address
Create a custom tool to collect and save a user's complete address to their contact profile.
## Overview
The **Save Address** custom tool enables your AI assistant to collect a user's full address (street, city, state, zip code) during a conversation and save it directly to the contact profile in GoHighLevel. This is particularly useful for service businesses that need addresses for appointments, inspections, or deliveries.
Since Version 2.1, Assistable includes a **pre-built** tool with this functionality. This guide is still useful for learning how to build custom tools from scratch.
## Prerequisites
* **AI Assistant Dashboard** — Access to custom tool creation
* **GoHighLevel CRM** — Access to automation workflows and contact profile fields
* **Endpoint URL** — Generated from an inbound webhook
## Step-by-Step Setup
In your assistant dashboard:
1. Go to **Assistants** → select your assistant
2. Under **Custom Tools**, click **Create a Custom Tool**
3. Configure:
* **Unique Name**: `save_address`
* **Description**: "Use this tool to collect and save the user's complete address including street, city, state, and zip code."
* **Parameters**: `street`, `city`, `state`, `zip_code`
* **Example Data**: "54 State Street, Albany, New York, 12207"
1. In GoHighLevel, go to **Automations** → create a new workflow titled "Save Address Webhook"
2. Set **Inbound Webhook** as the trigger
3. Copy the generated Webhook URL
4. Return to your custom tool setup and paste the URL in the endpoint field
5. Test the connection (look for a green checkmark)
In your assistant's **Prompts** section, add instructions like:
*"Ask the user for their full address, including the zip code. Once collected, call the save\_address function."*
Back in the GoHighLevel automation:
1. Click **Fetch Sample Request** to pull sample data
2. Add a **Find Contact** action using `contact_id` from the webhook
3. Add **Update Contact Field** actions mapping each field:
* Street Address → `Inbound Webhook > Arguments > street`
* City → `Inbound Webhook > Arguments > city`
* State → `Inbound Webhook > Arguments > state`
* Postal Code → `Inbound Webhook > Arguments > zip_code`
4. Save and publish the workflow
1. Run a test conversation with your AI assistant
2. Provide an address when prompted
3. Check the contact's **General Info** section in GoHighLevel
4. Verify all address fields are correctly populated
## FAQs
Ensure each address component (street, city, state, zip) is mapped to the correct field in the Update Contact Field action.
Yes — modify the tool parameters and field mappings to capture email, phone, or any other contact information.
Verify the custom tool is added to the assistant and that your prompt explicitly instructs the AI to call the tool after collecting the address.
## Related Pages
Calculate distance from the saved address
Update any contact field in GoHighLevel
Automatically fill custom fields
Extract user information automatically
# Scrape Website
Source: https://docs.assistable.ai/build/custom-tools/scrape-website
Create a custom tool that scrapes website content and returns it for your AI assistant to understand.
## Overview
The **Scrape Website** custom tool allows your AI assistant to fetch and read the contents of any website URL during a conversation. The scraped content is returned to the AI, which can then analyze, summarize, or answer questions about it.
## Use Cases
* **Lead research** — AI scrapes a prospect's website to personalize the conversation
* **Competitor analysis** — Fetch and summarize competitor pages on demand
* **Content verification** — Check if specific information exists on a webpage
* **Support** — Pull documentation or help articles in real time
## How It Works
The tool accepts a URL parameter, makes an HTTP request to fetch the page content, parses the HTML into readable text, and returns it to the AI assistant. The AI can then use this content as context for its responses.
In your assistant settings, create a new custom tool:
* **Name**: `scrape_website`
* **Description**: "Scrape and return the text content of a given website URL"
* **Parameters**: `url` (the website to scrape)
Use Buildship or a custom webhook to:
1. Receive the URL parameter
2. Fetch the webpage content
3. Parse HTML to extract readable text
4. Return the text content to the AI
If your scraping endpoint requires authentication, add the authorization header in the tool configuration.
Save the tool, add it to your assistant, and test by asking the AI to look up information from a specific URL.
Be mindful of rate limits and website terms of service when scraping. Some sites block automated requests.
## Related Pages
Capture visual screenshots instead
Search the web with your AI
Learn custom tool fundamentals
Optimize your AI's knowledge
# Screenshot Website
Source: https://docs.assistable.ai/build/custom-tools/screenshot-website
Create a custom tool that captures a screenshot of any website for your AI assistant.
## Overview
The **Screenshot Website** custom tool allows your AI assistant to capture a visual screenshot of any webpage. This is useful for visual verification, design reviews, or providing users with a preview of a website.
## Use Cases
* **Website previews** — Show users what a page looks like before visiting
* **Design verification** — Confirm landing pages render correctly
* **Documentation** — Capture visual evidence of web content
* **QA testing** — Verify deployment changes visually
## Setup
Create a new custom tool in your assistant:
* **Name**: `screenshot_website`
* **Description**: "Take a screenshot of the specified website URL"
* **Parameters**: `url` (the website to screenshot)
Use a screenshot API service (e.g., ScreenshotAPI, Puppeteer via Buildship) that accepts a URL and returns an image.
Paste the service endpoint into the tool configuration, save, and test by asking your AI to screenshot a website.
Pair this with the [Scrape Website](/build/custom-tools/scrape-website) tool to get both visual and text content from a page.
## Related Pages
Extract text content from websites
Add web search to your AI
Custom tool fundamentals
# Search the Web
Source: https://docs.assistable.ai/build/custom-tools/search-web
Create a custom tool that enables your AI assistant to search the web in real time.
## Overview
The **Search the Web** custom tool gives your AI assistant the ability to perform live web searches during a conversation. The tool calls the Bing search engine and returns results that the AI can use to answer questions with up-to-date information.
## Use Cases
* **Real-time information** — Answer questions about current events, pricing, or availability
* **Research** — Look up businesses, products, or services during a conversation
* **Fact-checking** — Verify claims or find supporting information
* **Competitive intelligence** — Research competitors on behalf of users
## Setup
In your assistant settings, create a new tool:
* **Name**: `search_the_web`
* **Description**: "Search the web for real-time information using the Bing search engine"
* **Parameters**: `query` (the search terms)
Set up a Buildship workflow or webhook that:
1. Receives the search query
2. Calls the Bing Search API (or similar search service)
3. Returns formatted search results to the AI
Connect the endpoint, save, and update your prompt to instruct the AI when to use web search (e.g., for questions outside its knowledge base).
To call the tool, use `search_the_web` — the response will contain results from the Bing search engine.
Combine with your [Knowledge Base](/troubleshooting/knowledge-base-optimization) so the AI tries internal knowledge first and only searches the web when needed.
## Related Pages
Scrape specific pages for detailed content
Capture visual screenshots
Custom tool fundamentals
Build a better knowledge base
# Send Conversation Summary
Source: https://docs.assistable.ai/build/custom-tools/send-summary
Create a custom tool that sends conversation summaries to your clients via email or SMS.
## Overview
The **Send Conversation Summary** tool enables your AI assistant to capture a summary of the conversation and deliver it to your clients (or your team) via email, SMS, or any notification channel. This keeps stakeholders informed about what was discussed without manually reviewing transcripts.
## How It Works
Go to **Settings > Custom Fields** in your GHL sub-account and create a new field called `conversation_summary` (type: Multi-line Text).
In your AI assistant, set up a custom **Extraction** tool that automatically populates the `conversation_summary` custom field with an AI-generated summary of the conversation.
Create a workflow triggered by a specific event (e.g., **Appointment Booked**):
1. Add an **SMS** or **Email** action
2. Include the custom field variable: `{{contact.conversation_summary}}`
3. The client receives a summary of what was discussed
## Example Workflow
After a booking call, your client receives:
> *"Summary: John called about a roof inspection at 54 State St. He prefers morning appointments and has a budget of \$500. Appointment booked for Tuesday 10am."*
This pairs well with the [Transcript Workflows](/how-to-guides/transcript-workflows) guide for sending full conversation transcripts.
## Related Pages
Send full conversation transcripts
Extract data automatically
Auto-fill custom fields
Custom tool fundamentals
# Submit Support Ticket
Source: https://docs.assistable.ai/build/custom-tools/submit-ticket
Create a custom tool that submits support tickets on behalf of users during AI conversations.
## Overview
The **Submit Support Ticket** custom tool allows your AI assistant to create and submit support tickets on behalf of users during a conversation. When a user reports an issue that can't be resolved immediately, the AI collects the details and submits a ticket to your support system.
## Use Cases
* **Customer support** — Escalate issues the AI can't resolve
* **Bug reports** — Collect technical details and submit automatically
* **Feature requests** — Capture and route user feedback
* **Service requests** — Create work orders or service tickets
## Setup
In your assistant settings, create a new tool:
* **Name**: `submit_support_ticket`
* **Description**: "Submit a support ticket on behalf of the user with their issue details"
* **Parameters**: `subject`, `description`, `priority` (optional), `category` (optional)
Create an inbound webhook in GoHighLevel (or your ticketing system) that:
1. Receives the ticket data
2. Creates a support ticket or task
3. Notifies the appropriate team
Instruct the AI to:
* Try to resolve the issue first
* If unable, collect all relevant details
* Confirm the ticket details with the user before submitting
* Provide a confirmation after submission
Simulate a support scenario and verify the ticket appears in your system with all details intact.
Add the user's contact information automatically using [variables](/build/variables-reference) like `{{contact.email}}` and `{{contact.phone}}`.
## Related Pages
Update contact information in CRM
Send conversation summaries
Custom tool fundamentals
# Update Contact in GoHighLevel
Source: https://docs.assistable.ai/build/custom-tools/update-contact
Create a custom tool to update contact information in GoHighLevel from AI conversations.
## Overview
The **Update Contact** custom tool enables your AI assistant to update contact information directly in GoHighLevel during a conversation. The AI collects information naturally and pushes it to the CRM — no manual data entry required.
Since Version 2.1, Assistable includes a **pre-built** tool for this. This guide is helpful for learning how to build custom tools from scratch.
## How It Works
The tool uses a GoHighLevel inbound webhook workflow:
1. **AI collects data** during conversation (name, email, etc.)
2. **Tool fires** with the collected data as parameters
3. **Webhook triggers** a GHL automation workflow
4. **Workflow finds contact** by contact ID and updates the specified fields
## Setup
* **Name**: `update_contact_info`
* **Description**: "Update the user's contact information in the CRM"
* **Parameters**: Define fields you want to update (e.g., `email`, `name`, `phone`, `company`)
1. Go to **Automations** → Create new workflow
2. Set trigger to **Inbound Webhook**
3. Copy the webhook URL to your custom tool's endpoint field
Add a **Find Contact** action:
* Search by **Contact ID** using the `contact_id` from the webhook payload
Add **Update Contact** actions mapping each field from the webhook's arguments:
Publish the workflow, then test by having the AI collect and update contact information during a conversation.
## Related Pages
Save user addresses to contact profiles
Automatically extract user information
Auto-fill custom fields
Custom tool fundamentals
# Setting Up Your API Key
Source: https://docs.assistable.ai/build/flow-builder/api-key
Configure your LLM API key for Flow Builder using OpenAI, Anthropic, or OpenRouter.
## Overview
Flow Builder uses a **Bring Your Own Key (BYOK)** model. You provide your own LLM API key, and the platform routes all AI calls through your account. This gives you control over costs, rate limits, and model access.
An API key is **required** before you can test or deploy any flow. Without one, Conversation and Extraction nodes have no LLM to call.
## Supported Providers
| Provider | Key Format | Models |
| -------------- | ------------ | ----------------------------------- |
| **OpenAI** | `sk-...` | GPT-4o, GPT-4o-mini, GPT-4, etc. |
| **Anthropic** | `sk-ant-...` | Claude Sonnet, Claude Haiku, etc. |
| **OpenRouter** | `sk-or-...` | 100+ models from multiple providers |
## Adding Your Key
Click the **Settings** icon (gear) in the top toolbar.
Choose OpenAI, Anthropic, or OpenRouter from the dropdown.
Enter your API key and click **Save**.
Select the default model for the flow. Individual nodes can override this in their advanced settings.
## Model Recommendations
* **Voice flows** (latency matters): `gpt-4o-mini` or `claude-haiku`
* **Complex reasoning**: `gpt-4o` or `claude-sonnet`
* **Multi-provider access**: Use **OpenRouter** for a single key across all providers
## Troubleshooting
| Issue | Solution |
| ----------------------- | ------------------------------------------------ |
| "No API key configured" | Open Settings and verify your key is saved |
| 401 Unauthorized | Check that your key is valid and hasn't expired |
| Model not available | Ensure your API plan includes the selected model |
| Rate limit errors | Check your provider's usage dashboard |
Your API key is never shared with other users or flows. Each flow stores its own key independently.
## Related Pages
Test your flow with your key
How models are resolved
Deploy to voice
# Conversation Node
Source: https://docs.assistable.ai/build/flow-builder/conversation-node
The core building block of Flow Builder where your AI engages with users in natural conversation.
## Overview
The Conversation node is the heart of every flow. It's the **only node type that directly communicates with the user** — generating responses, handling dialogue, and deciding when to transition to the next step. Every flow must have at least one Conversation node (the start node), and most flows have several.
## Instruction Modes
### Prompt Mode (Default)
The node's instruction becomes the system prompt for the LLM. The AI generates conversational responses based on this prompt and the conversation history. This is the mode you'll use 95% of the time.
```
You are a scheduling assistant for Acme Dental.
Ask the caller for their preferred date and time.
Only offer weekday slots between 9 AM and 5 PM.
Confirm the details before proceeding.
```
The prompt supports `{{variable}}` substitution for dynamic personalization:
```
You are speaking with {{caller_name}}.
Their account number is {{account_id}}.
Greet them by name and ask how you can help.
```
### Static Mode
The instruction text is sent directly to the user **verbatim** — no LLM call is made. Use this for fixed messages like greetings or disclaimers.
If the conversation revisits a static node (e.g., via a loop), it automatically switches to prompt mode on subsequent visits. Static mode only applies on the first visit.
## Transitions
Transitions are the most powerful feature of the Conversation node. Each transition is a condition that, when met, moves the conversation to a connected node.
### How Transitions Work
Under the hood, each transition condition is registered as a **tool/function call** with the LLM. When the AI determines a condition is met, it fires the corresponding tool call instead of generating a regular response. The engine then follows the edge to the destination node, which generates the actual response.
This means **transitions and responses happen in a single LLM call** — the source node decides to transition, and the destination node speaks. This is what keeps Flow Builder fast for voice.
### Adding Transitions
Click the **+ Add Transition** button on a Conversation node. Each transition has:
* **Condition** — A natural language description (e.g., "The user confirms their appointment")
* **Edge handle** — A green dot appears on the right side of the node. Drag from it to the destination node.
### Must Respond First
By default, a Conversation node **skips transition evaluation on its first visit**. The AI responds first, then evaluates transitions on subsequent messages. This prevents the AI from immediately transitioning away before the user hears the node's response.
## AI-Powered Features
### AI Suggest
Click the **sparkle icon** to have AI analyze your prompt and automatically suggest likely transition conditions. For example, if your prompt asks about appointment booking, AI Suggest might generate transitions like "User provides a date and time" and "User wants to cancel instead."
### Improve Prompt
Click the **magic wand icon** to have AI rewrite your prompt into an optimized, task-based framework. See [Node Builder AI](/build/flow-builder/node-builder-ai) for details.
## Global Nodes
Conversation nodes can be marked as **global**, making them accessible from any point in the flow. This is useful for handling universal intents like "I want to speak to a human" or "Cancel my appointment" regardless of where the user is in the conversation.
## Related Pages
Route conversations based on conditions
Dynamic data and substitution
Test your flow in the built-in panel
AI-assisted node generation
# Embedding the Chat Widget
Source: https://docs.assistable.ai/build/flow-builder/embedding-widget
Deploy your flow as an embeddable chat widget on any website.
## Overview
Flow Builder can generate an embeddable chat widget that you drop into any website. The widget runs your flow as a chat assistant, giving visitors a conversational interface without leaving your site.
## Setup
Navigate to your flow in Flow Builder.
Click the **Deploy** or **Widget** button in the toolbar. Configure colors, position, and welcome message.
Copy the generated embed code.
Add the script just before the closing `