Get TFU Live catalog
Lists what a TFU Live agent can be built from: the workflow model (data.workflows: every node with its settings in words and as JSON Schema, its outputs, timing and the arguments it takes, the templates and which of their settings must be filled before saving, the rules and the limits), the sub-account’s CRM (data.subAccount, where the built-in CRM has no tags), the tool groups that stay tools, voice names and background rooms. It is not an agent’s configuration: equipped is always false here. Read the agent for that. The full workflow reference is in Workflows contract.
Required scope: agents:read.
Required API key scope: agents:read.
GET
/
api
/
tfu-live-agents
/
{id}
/
brain
/
catalog
cURL
curl --request GET \
--url https://api.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog \
--header 'Authorization: Bearer YOUR_API_KEY'import requests
url = "https://api.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"capabilities": [
{
"id": "outreach",
"name": "Messages",
"purpose": "Text the lead during a conversation, now or at a time they ask for. Callbacks, transfers, bookings and the rest are workflows.",
"supported": true,
"equipped": false,
"partiallyEquipped": false
}
],
"voices": [
"marin",
"cedar"
],
"rooms": [
{
"id": "office",
"name": "Office"
}
],
"workflows": {
"configurationRoot": "workflows",
"nodes": [
{
"type": "check_tag",
"name": "Check tag",
"timing": "waits",
"outputs": [
"yes",
"no"
],
"summary": "Checks whether the contact has one tag and continues on Yes or No. The AI learns the answer (checkedTags).",
"settings": {
"tag": "the tag to check"
},
"settingsSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"tag": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "One CRM tag, not tfu_ai_kill_switch or tfu_ai_standby."
}
},
"required": [
"tag"
]
},
"arguments": [],
"argumentSchemas": {}
}
],
"templates": [
{
"key": "check_tag",
"name": "Check tag",
"description": "Use when you need to know whether the lead has this tag.",
"steps": [
{
"id": "check",
"type": "check_tag",
"config": {
"tag": ""
},
"outputs": {
"yes": [],
"no": []
}
}
],
"mustFill": [
{
"step": "check",
"setting": "tag"
}
]
}
],
"rules": [
"Put on DND ends the lead’s journey. Only internal steps can follow it on its path, in one list, and they still run for the stopped lead: Add tag, Remove tag, Set field, Move stage, Add note, Notify teammate, Send webhook. Nothing that contacts the lead or needs the AI on the call can follow it, and no Condition. Book appointment needs a Find slots node earlier on its path."
],
"limits": {
"workflows": 20,
"outputDepth": 5,
"stepsPerWorkflow": 60,
"nameLength": 60,
"descriptionLength": 3000,
"labelLength": 120,
"totalBytes": 180000,
"toolNameLength": 64,
"toolDescriptionSent": 1024
}
},
"subAccount": {
"crm": "ghl",
"nativeCrm": false,
"tagNodes": true
}
}
}Authorizations
Path Parameters
Query Parameters
⌘I
cURL
curl --request GET \
--url https://api.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog \
--header 'Authorization: Bearer YOUR_API_KEY'import requests
url = "https://api.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.teamfollowup.ai/api/tfu-live-agents/{id}/brain/catalog")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"capabilities": [
{
"id": "outreach",
"name": "Messages",
"purpose": "Text the lead during a conversation, now or at a time they ask for. Callbacks, transfers, bookings and the rest are workflows.",
"supported": true,
"equipped": false,
"partiallyEquipped": false
}
],
"voices": [
"marin",
"cedar"
],
"rooms": [
{
"id": "office",
"name": "Office"
}
],
"workflows": {
"configurationRoot": "workflows",
"nodes": [
{
"type": "check_tag",
"name": "Check tag",
"timing": "waits",
"outputs": [
"yes",
"no"
],
"summary": "Checks whether the contact has one tag and continues on Yes or No. The AI learns the answer (checkedTags).",
"settings": {
"tag": "the tag to check"
},
"settingsSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"tag": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "One CRM tag, not tfu_ai_kill_switch or tfu_ai_standby."
}
},
"required": [
"tag"
]
},
"arguments": [],
"argumentSchemas": {}
}
],
"templates": [
{
"key": "check_tag",
"name": "Check tag",
"description": "Use when you need to know whether the lead has this tag.",
"steps": [
{
"id": "check",
"type": "check_tag",
"config": {
"tag": ""
},
"outputs": {
"yes": [],
"no": []
}
}
],
"mustFill": [
{
"step": "check",
"setting": "tag"
}
]
}
],
"rules": [
"Put on DND ends the lead’s journey. Only internal steps can follow it on its path, in one list, and they still run for the stopped lead: Add tag, Remove tag, Set field, Move stage, Add note, Notify teammate, Send webhook. Nothing that contacts the lead or needs the AI on the call can follow it, and no Condition. Book appointment needs a Find slots node earlier on its path."
],
"limits": {
"workflows": 20,
"outputDepth": 5,
"stepsPerWorkflow": 60,
"nameLength": 60,
"descriptionLength": 3000,
"labelLength": 120,
"totalBytes": 180000,
"toolNameLength": 64,
"toolDescriptionSent": 1024
}
},
"subAccount": {
"crm": "ghl",
"nativeCrm": false,
"tagNodes": true
}
}
}